JMM
java memory model.
原子性,可见性,有序性。
cpu会存在高速缓冲区,分配于每个线程内部的私有区域,但是都会写回到主内存中。
原子性:
![](https://img.haomeiwen.com/i4464433/539773d9f2f36fca.png)
一个i++操作是分好几个步骤的,会先拷贝到线程内部,然后运算,写回到主存中。
可加性:
volative,内存屏障,lock,final修饰域都能保证其可见性。
有序性:
cpu为了高速执行,会多线程的去执行这些指令,会保证最终结果的一致性.
指令重排序不会影响单个线程的执行,但是会影响到并发执行的正确性。
![](https://img.haomeiwen.com/i4464433/cdf335d4da38f3a7.png)
比如dcl,A,B并发执行,A将instance赋值 ,但是B还是拿到空的Instance,又会去赋值.
![](https://img.haomeiwen.com/i4464433/23dc05e3927e6391.png)
JMM模型:
![](https://img.haomeiwen.com/i4464433/7c15eceb75c53769.png)
java p -c 可以看到Lock前缀指令。
前缀指令执行期间会锁住总线,防止指令重排序,确保读在写之后,刷新store buffer会导致cache副本失效.
JVM层面:
以上是基于理论的:
那么实际 是硬件层面做了支持.
内存屏障有2个能力
- 防止指令重排序
- 刷新处理器缓存
网友评论