JMM内存模型与CPU缓存模型类似,CPU不是直接去主内存获取数据,而是中间有一个CPU缓存,CPU从缓存中获取数据。在线程内存中有共享变量的副本,线程操作的是这个副本,再同步给主内存,这种机制导致线程1对共享变量进行改变,其他线程不会实时感知到。
Volatile
volatile关键字保证了共享变量实时可见(可见性)和有序性。(原子性只能通过sync去保证)
缓存一致性协议
缓存一致性从硬件层面上保证了被volatile修饰的变量修改后马上会同步给主内存,其他cpu通过总线嗅探机制感知到数据的变化(数据存储到主内存会经过总线),从而使自己的副本失效。
指令重排序
CPU在运行过程中,会根据语义自己去优化代码的执行顺序。
as-if-serial和happens-before原则
大致就是不管怎么重排序,单线程程序的执行结果不能被改变。(语句之间没有依赖)
内存屏障
内存屏障都是通过硬件层面实现。
双重检查锁单例半初始化问题
从字节码程度上来说,对象创建会先赋零值,再初始化。指令重排序可能导致返回还没有进行初始化的对象。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。