【并发编程系列】是整理自极客时间上王宝令老师的专栏:《Java并发编程实战》。
如有侵权,请告知。
0.定义
可见性: 一个线程对共享变量的修改,另一个线程能够立刻看到。
原子性: 一个或多个操作在CPU执行过程中不被中断,称为原子性。
有序性: 程序按照代码的先后顺序执行。
- 导致可见性问题的原因是CPU缓存;
- 导致有序性问题的原因是编译优化。
- 线程切换可能带来原子性问题
解决问题的直接方法就是禁用缓存和优化。Java内存模型JVM如何按需禁用缓存和编译优化的方法。
具体来说这些方法包括 volatile、synchronized 和final三个关键字,以及六项Happens-Before
1.缓存导致的可见性问题
如果是单核CPU,所有的线程都在一个CPU上运行,那么CPU缓存和内存的一致性很容易解决。多个线程操作的都是CPU中的同一个值
现在是多核CPU时代,每个CPU都有自己的缓存。当多个线程在不同CPU上执行时,这些线程操作的是不同的CPU缓存。这时候A线程对共享变量的操作,对B线程就不具备可见性了。
2.线程切换带来的原子性问题
操作系统允许某个进程执行一小段时间。例如