volatile细节:关于指令重排内存屏障和总线风暴
关于指令重排内存屏障和总线风暴
指令重排
java语言规范规定JVM线程内部维持顺序化语义。即只要程序的最终结果与它顺序化情况的结果相等,那么指令的执行顺序可以与代码顺序不一致,此过程叫指令的重排序。
从源码到最后执行的指令序列过程是:
源码->编译器优化重排序->指令级并行重排序->内存系统重排序->最后执行的指令序列
内存屏障
内存屏障可以禁止指令重排序
在这里插入图片描述
从上图可以看出:
1)当第二个操作是volatile写时,不管第一个操作是什么,都不能重排序。这个规则确保volatile写之前的操作不会被编译器重排序到volatile写之后。
2)当第一个操作是volatile读时,不管第二个操作是什么,都不能重排序。这个规则确保volatile读之后的操作不会被编译器重排序到volatile读之前。
3)当第一个操作是volatile写,第二个操作是volatile读时,不能重排序。
JMM内存屏障插入策略:
1)在每个volatile写操作的前面插入一个StoreStore屏障。
2)在每个volatile写操作的后面插入一个StoreLoad屏障。
3)在每个volatile读操作的后面插入一个LoadLoad屏障。
4)在每个volatile读操作的后面插入一个LoadStore屏障。
总线风暴
由于volatile的mesi缓存一致性协议需要不断的从主内存嗅探和cas不断循环无效交互导致总线带宽达到峰值
解决办法:部分volatile和cas使用synchronize
我是"道祖且长",一个在互联网苟且偷生的Java程序员
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~