概述
目录
并发编程解决的核心问题
分工
协作
资源分配(互斥)
线程安全性问题
可见性
有序性
原子性:
管程相关的死锁处理
线程的生命周期
并发容器
并发编程解决的核心问题
并发编程三个主要问题:分工、协作和资源分配。
分工:拆解和分配任务;
协作:线程间的等待、通知等协作;
资源分配(互斥):同一时刻只允许一个/部分线程访问共享资源;
协作问题,资源分配(互斥)问题使用管程;
分工
分工问题使用多线程解决;
多线程并行操作:线程池 +Future;
多线程聚合操作:CompletableFuture
多线程批量操作:CompletionService
多线程分治操作:Fork/Join
协作
线程间的协作,主要通过管程的等待和通知模式;
管程的实现方式:synchronized,Lock
其他的协作工具:
Semaphore
CountDownLatch
CyclicBarrier
资源分配(互斥)
共享资源的互斥问题一般通过加互斥锁,或者其他无锁模式解决;
管程的实现方式:synchronized,Lock
无锁模式:
不变模式
写时复制模式Copy-on-Write
线程本地存储模式
CAS和原子类
线程安全性问题
线程安全是指:运行结果是确定的。
导致不确定的主要源头是:可见性问题,有序性问题,原子性问题。
可见性
可见性问题由CPU缓存导致;
解决方案:根据程序逻辑,按需禁用缓存。
具体方法:volatile、synchronized 和 final 三个关键字,Happens-Before规则。
有序性
有序性问题由编译优化导致;
解决方案:根据程序逻辑,按需禁用编译优化。
主要靠Happens-Before约束完成。
原子性:
原子性问题由线程切换导致;
解决方案:保证操作的中间状态对外不可见。通过互斥锁,让一块代码区域只有一个线程能
够执行。
具体方法:管程(synchronized,Lock)
管程相关的死锁处理
破坏死锁条件:占有且等待,不可抢占,循环等待;
线程的生命周期
可运行状态,休眠状态(阻塞状态,有时限等待状态,无时限等待状态),终止状态;
并发容器
同步容器
jdk1.5之前通过synchronized实现的同步容器;
Collections.synchronizedXXX() 包装生成的同步容器;
Vector、Stack 和 Hashtable,Java 提供的同步容器;
并发容器
jdk1.5及之后,为提升性能实现的安全容器;
List:CopyOnWriteArrayList
Map:ConcurrentHashMap,ConcurrentSkipListMap;
Set:CopyOnWriteArraySet,ConcurrentSkipListSet;
Queue:
1,单端阻塞队列:LinkedBlockingQueue,ArrayBlockingQueue
2,双端阻塞队列:LinkedBlockingDeque
3,单端非阻塞队列:ConcurrentLinkedQueue
4,双端非阻塞队列:ConcurrentLinkedDeque
最后
以上就是野性蜜粉为你收集整理的Java并发编程(八)- 总结并发编程解决的核心问题线程安全性问题管程相关的死锁处理 线程的生命周期并发容器的全部内容,希望文章能够帮你解决Java并发编程(八)- 总结并发编程解决的核心问题线程安全性问题管程相关的死锁处理 线程的生命周期并发容器所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复