一、并发的bug源头
1、缓存导致的内存可见性问题;
2、线程切换导致原子性问题;
3、编译优化导致的有序性问题;
二、java 解决可见性和有序性问题
1、使用volatile
2、Happen-before 原则
1)程序的顺序性问题;
2)volatile 原则;
3)传递性;
4)管道中锁的规则;
5)线程start() 规则;
6)线程 join 规则;
三、互斥锁
1、用不同的锁对不同的资源精细化管理,细粒度锁;
2、保护有关联关系的多个资源;
四、死锁
如何避免死锁
1、破坏占用且等待条件;
2、破坏不可抢占的条件;
3、破坏循环等待条件;
五、等待-通知 优化循环等待
1、就医流程与锁的映射;
2、notify、notifyAll、wait;