| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> Java知识库 -> java 并发编程 -> 正文阅读 |
|
[Java知识库]java 并发编程 |
目录 4. Thread类中 stop、interrupt、isInterrupt、interrupted 区别 10. yield、sleep、wait、notify 锁的释放? 11. CountDownLatch & CyclicBarrier 11.3 CountDownLatch & CyclicBarrier 总结 16.5 AbstractQueuedSynchronized AQS同步器? 16.5.1 AbstractQueuedSynchronized 需要自己实现的方法? 16.5.2 AbstractQueuedSynchronized 其他方法 17.2 ReentrantReadWriteLock 实现原理 18. JDK 1.7 ConCurrentHashMap? 19.7 ConcurrentHashMap 1.7&1.8区别 20.1 ConcurrentSkipListMap & ConcurrentSkipListSet 20.2 CopyOnWriteArrayList&ConpyOnWriteArraySet 写时复制容器 21.4 JDK中默认线程池实现 Executors.new***() 1. 进程&线程是什么?
2. 并发&并行区别?
3.? JAVA中创建线程几种方式两种方式(jdk Thread类官方翻译两种 )
4. Thread类中 stop、interrupt、isInterrupt、interrupted 区别
5.? 线程生命周期
? ? ?Thread类相关方法
6. synchronized内置锁 与 volatile
PS:synchronized 关键字 锁的对象不能改变,改变会导致锁失效,不能保证线程安全(基本类型 参考反编译文件) 如 .java文件中一段代码 int num=0; num++; 那么编译后 就会变成这段 Integer num=0; num=Integer.valueOf(num.intValue()); valueOf 实际上是new 了一个对象 如果我们用synchronized(Integer num) 的时候锁就失效了,不是同一个对象 7. 并发工具ThreadLocal7.1 ThreadLocal 实现原理ThreadLocal get set remove 操作,都会去调用Thread.currentThread()拿到当前线程 而每个Thread对象中,都有ThreadLocal.ThreadLocalMap threadLocals 变量, 这个threadLocals map key是当前这个ThreadLocal 对象 所以每次ThreadLocal操作,最终会去操作当前线程中threadLocals 变量中的值 7.2 ThreadLocal 内存泄漏?ThreadLocalMap 中 key 是一个ThreadLocal 的弱引用 当jvm内存不够用是可能会回收掉 key 导致,key 一直是空的,一直会保留在内存中,无法释放 threadLocal=null 会将ThreadLocal变成一个弱引用,可能会被gc释放(假设被gc放), 会导致ThreadLocalMap中存留key=null value=object 这样一个结构,导致永远无法被gc 释放 7.3 ThreadLocal 使用注意ThreadLocal 每次使用后 不要忘记 使用remove 释放内存 或者 申明Thread变量为static f inal的 这样这个ThreadLocal 一直都是强引用 ThreadLocal set的值 确保不是共享的,会导致线程不安全 ?8. 强、软、弱、虚 引用
9. wait、notify、notifyAll 使用
生产者: synchronized(object){ while(业务条件不满足) //释放锁 阻塞当前线程 object.wait(); } 消费者: synchronized(object){ //业务操作,操作完之后通知其他等待的线程,唤醒其他线程 object.notifyAll(); //同步代码块最后面调用 } PS:建议使用notifyAll ,notify方法 只唤醒一个线程? 10. yield、sleep、wait、notify 锁的释放?
11. CountDownLatch & CyclicBarrier?11.1 CountDownLatch 使用?假设有20个用户需要插入数据库,一个线程太慢我们用10个线程处理 每个线程插入2个(不一定是2个) ?11.2 CyclicBarrier 使用假设同样需求20个用户 10个线程执行 每个线程插入2个 11.3 CountDownLatch & CyclicBarrier 总结
12. Semaphore 使用假设我们有个login业务,这个登录接口某个时间段(并发量)只允许10个用户登录 PS:Semaphore 使用注意点,可能有坑 由于代码逻辑问题,先调用release()释放许可证,再去调用acquire 去拿许可证 假设许可证数量 为10 ,由于程序逻辑bug 先调用release 再调用qcquire 会导致这个工具完全失效,永远不会限制许可证数量 13. Exchange 数据交换器假设,有两个同学正在写作业,小明、小红,小明不学好作业没写,小红作业写好了,小明使坏 小明:小红 我作业写的很好,要不我们交换下吧,你拿我作业我能保证你明天拿一个小红花 小红:ヾ(≧▽≦*)o 好的好的! ?14. FutureTask & Callable 使用假设业务场景:我与张三一起玩耍,不开心了, 张三不讲武德,上来就给了我一拳,我又打不过他,怎么办?我就回去叫我家大黄(汪汪汪~),让我家大黄替我教训他(咬他-启动线程托管,教训张三的事情我不管了),大黄放出去了,但是不能乱咬啊,如果咬错了,我要上门道歉啊,所以就得问大黄,他今天咬谁(返回值)了。 又假设业务场景,大黄今天发疯了,一直咬,一直咬个不停,只有我能管得住(良民大大的,不能把事情闹大,得把大黄阻止住)cancle()方法调用 PS:cancle()方法调用其实就是调用Thread.interrupt() 具体中断逻辑得自己实现 14. Fork/Join 使用?
假设计算0-100w数据可分割多个任务,交给多个线程去执行,再将执行结果合并 15. 原子操作CAS15.1?什么是原子操作CAS谓原子操作是指不会被线程调度机制打断的操作;这种操作一旦开始,就一直运行到结束,中间不会有任何cpu上下文切换 (来源百度百科) 15.2 原子操作原理原子操作不是由操作系统 编程语言 支持,而是由硬件cpu支持的 如果原子操作不成功,他会一直循环直到成功 15.3 原子操作存在的问题
15.4 Jdk中提供一些原子操作类?
16. 显示锁&AQS同步器16.1 什么是显示锁显示锁(编程式锁)上锁、释放锁,由程序员通过coding决定,是再代码中能看见的 16.2 公平锁&非公平锁?
16.3 共享锁与排他锁&读写锁?
16.4 了解LockSupport 工具类中方法
16.5 AbstractQueuedSynchronized AQS同步器?AbstractQueuedSynchronized 是java 提供给开发者 实现 显示锁的一个模板 16.5.1 AbstractQueuedSynchronized 需要自己实现的方法?
16.5.2 AbstractQueuedSynchronized 其他方法
16.5.3 Node&ConditionObject
16.5.4 独占锁原理&流程释放锁流程: tryRelease() 返回true 释放锁成功,唤醒头节点的下一个节点 拿锁流程:
17. JDK中显示锁
17.1 ReentrantLock 如何避免死锁加锁: 解锁: 17.2 ReentrantReadWriteLock 实现原理ReentrantReadWriteLock 关键在于 AQS 同步器 ReadLock WriteLock 构造函数都需要一个同步器,而这个同步器是使用了同一个的 而这个同步器的一个state 状态 是int类型(Java 一个int类型 是 32bit) state 分左半边(高位)表示共享锁|读锁数量 右半边(低位)排他锁|写锁 数量 读锁:拿读锁时判断(低位不等于0)是否有排他锁|写锁,没有排他锁时 才能拿到,有排他锁加入队列里,再阻塞当前线程 写锁: state 不等于0 说明有锁 ,什么锁 不知道 去计算w(写锁|排他锁)数量 第一种 情况:w写锁数量等于0 说明有读锁存在 返回false 阻塞 第二种 情况:w不等于0(有写锁)如果当前线程不等于持有锁线程 返回false 阻塞 能走第二个if:说明 当前这个写锁 是自己加的 state 等于0 说明读锁写锁都没有 直接原子操作去维护状态和持有锁线程 18. JDK 1.7 ConCurrentHashMap?18.1 数据结构Concurrent 中 segments属性 Segment数组 组成 Segment 中 table属性 HashEntry组成 Segment 继承 ReentrantLock 本身是一个锁 HashEntry 是一个单向链表 18.2 初始化?ConcurrentHashMap Segment默认大小为16 默认并发量为16 Segement中table 默认大小为2 ConcurrentHashMap Segment默认初始化1个 18.3 Hash值计算key.hashCode 再进行散列(Wang/Jenkins hash) ?18.4 元素定位通过自己hash()算法 再与segementShift 和 segmentMask 计算取余 定位具体segement 再通自己hash()算法 与 segment中table 数量计算取余 定位具体 HashEntry 遍历HashEntry 判断 key 是否相等 18.5 HashEntry[] table 扩容table 扩容 每次扩容是翻倍x2 扩容后 会 reHash()重新计算(部分)HashEntry落点 18.6 如何保证线程安全?put操作时由于Segement extents ReentrantLock 代表他自己本身就是一个锁 put时 会将自己上锁保证同一时刻只能有一个线程put成功 可见性 由 JDK中 volatile 关键字实现 18.7 Size实现不加锁情况便利每个元素 (2次) 如果两次的值一样 返回 如果两次值不一样 锁住所有Segment 在进行统计返回 19. JDK1.8 ConcurrentHashMap19.1 数据结构Node 数组 Node=链表|红黑树结构TreeBin 链表长度为8时,转换为红黑树结构 19.2 初始化1.8中 没做任何事情 初始容量也是16 table 初始化在put操作时 判断 table 是否为空 仅new 了一个 Node[] 初始化table后 sizeCtl 默认为(16*0.75)12 Node初始化 每次put时 定位Table[i] 为空 再初始化Node 19.3 Hash值计算再散列(散列规则与1.7不一样Wang/jenkins) 同样是再散列 19.4 table 扩容翻倍扩容 扩容时判断 Node节点大小 >8 转树结构 <8 转链表结构 多个线程put 时,会由多个线程并发扩容 19.5 如何保证线程安全通过Synchronized 内置锁,锁住Node 可见性 同样使用volatile 19.6 Size 实现内部 使用 ConterCell [] 数组 count累加 根据当前线程计算坐标于哪个ConterCell 然后会 进行快速一次 cas操作 如果失败会调用fullAddCount 方法 自旋cas 而size方法 统计 就是 遍历 这个ConterCell数组 累加value属性 19.7 ConcurrentHashMap 1.7&1.8区别
20. 跟多并发容器????????20.1 ConcurrentSkipListMap & ConcurrentSkipListSet
20.2 CopyOnWriteArrayList&ConpyOnWriteArraySet 写时复制容器
20.3 阻塞队列
21. 线程池21.1 为什么使用线程池线程创建-上下文切换(wait notify)时非常消耗cpu的 项目中如果频繁去创建线程,用一次就丢掉,会浪费大量cpu性能 如果将n个线程做统一管理 可以避免频繁创建线程而浪费cpu性能 21.2 线程池中参数含义
21.3 如何合理配置线程数量
21.4 JDK中默认线程池实现 Executors.new***()
22. PS仅仅自己对并发编程一些理解,不喜勿喷。 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年1日历 | -2025/1/31 10:26:30- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |