JMM内存模型学习

JMM内存模型学习_第1张图片
JMM内存模型学习_第2张图片JMM内存模型学习_第3张图片JMM内存模型学习_第4张图片JMM内存模型学习_第5张图片JMM内存模型学习_第6张图片JMM内存模型学习_第7张图片JMM内存模型学习_第8张图片

JMM内存模型与CPU缓存模型类似,CPU不是直接去主内存获取数据,而是中间有一个CPU缓存,CPU从缓存中获取数据。在线程内存中有共享变量的副本,线程操作的是这个副本,再同步给主内存,这种机制导致线程1对共享变量进行改变,其他线程不会实时感知到。

Volatile
volatile关键字保证了共享变量实时可见(可见性)和有序性。(原子性只能通过sync去保证)

缓存一致性协议
缓存一致性从硬件层面上保证了被volatile修饰的变量修改后马上会同步给主内存,其他cpu通过总线嗅探机制感知到数据的变化(数据存储到主内存会经过总线),从而使自己的副本失效。

指令重排序
CPU在运行过程中,会根据语义自己去优化代码的执行顺序。

as-if-serial和happens-before原则
大致就是不管怎么重排序,单线程程序的执行结果不能被改变。(语句之间没有依赖)

内存屏障
JMM内存模型学习_第9张图片
内存屏障都是通过硬件层面实现。

双重检查锁单例半初始化问题
从字节码程度上来说,对象创建会先赋零值,再初始化。指令重排序可能导致返回还没有进行初始化的对象。

你可能感兴趣的:(jmm)