988884fdca7ecdcc1b9c9ca33bf82d4.png
2cfba94413d1f93e00f65f772641e02.pngfb8523e106eb8ada944c3fbf37abea8.pngdaeee99cd1fa65d5774a954cc99eeb4.png6acfc999e722fac34da86a29fc3c45d.png59274ff7c3716910460dfbb0f5ffc7e.pngad09a8247ad3c76f8e320cc1eef651c.png0e16189c6524d7571899c615f3bf54d.png

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

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

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

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

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

内存屏障
4f02188ddb853d8e8dadf8b1aa9b8dc.png
内存屏障都是通过硬件层面实现。

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


啦啦啦
1 声望0 粉丝

« 上一篇
Redis

引用和评论

0 条评论