- 导致可见性的原因是缓存,导致有序性的原因是编译优化,那解决可见性、有序性最直接的办法就是禁用缓存和编译优化,合理的方案应该是按需禁用缓存以及编译优化。
- Java内存模型是个很复杂的规范,站在我们这些程序员的视角,本质上可以理解为,Java内存模型规范了JVM如何提供按需禁用缓存和编译优化的方法。
- 具体来说,这些方法包括 volatile、synchronized 和 final 三个关键字,以及六项 Happens-Before 规则。
- Happens-Before 规则
- 程序的顺序性规则.这条规则是指在一个线程中,按照程序顺序,前面的操作 Happens-Before 于后续的任意操作。
- volatile变量规则。这条规则是指对一个volatile变量的写操作, Happens-Before 于后续对这个volatile变量的读操作。
- 传递性。这条规则是指如果A Happens-Before B,且B Happens-Before C,那么A Happens-Before C。
- 管程中锁的规则。这条规则是指对一个锁的解锁 Happens-Before 于后续对这个锁的加锁。
- 线程 start() 规则。这条是关于线程启动的。它是指主线程A启动子线程B后,子线程B能够看到主线程在启动子线程B前的操作。
- 线程 join() 规则。这条是关于线程等待的。它是指主线程A等待子线程B完成(主线程A通过调用子线程B的join()方法实现),当子线程B完成后(主线程A中join()方法返回),主线程能够看到子线程的操作。当然所谓的“看到”,指的是对共享变量的操作。
posted @
2023-06-20 20:41
弘一
阅读(
27)
评论()
编辑
收藏
举报
点击右上角即可分享
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南