关于Java如何在新的内存模型中实现volatile的困惑(JSR 133)
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了关于Java如何在新的内存模型中实现volatile的困惑(JSR 133),小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1212字,纯文字阅读大概需要2分钟。
内容图文
在JSR 133 Java Memory Model FAQ中,它指出
the new memory model places stricter constraints on reordering of
volatile field accesses with other field accesses, volatile or not,
anything that was visible to thread A when it writes to volatile field
f becomes visible to thread B when it reads f
它还提供了如何使用易失性字段的示例
class VolatileExample {
int x = 0;
volatile boolean v = false;
public void writer() {
x = 42;
v = true;
}
public void reader() {
if (v == true) {
//uses x - guaranteed to see 42.
}
}
}
在上面的代码中,JVM(JIT?)会在reader()的v负载和x负载之间插入一个LoadLoad内存屏障/栅栏,请参阅The JSR-133 Cookbook for Compiler Writers(实际实现取决于底层CPU体系结构)
并且硬件使用缓存一致性协议来确保L1,2 …缓存和主内存之间的一致性.
但是我想这些机制似乎还不够.为了保证在reader()中看到42,JVM(JIT)是否必须从主内存(或由硬件控制的L1,2 ..高速缓存)而不是CPU寄存器中读取v(非易失性)和x(易失性) ?
是否有任何链接或文档显示了JVM如何实现新内存模型的详细信息? The JSR-133 Cookbook for Compiler Writers仅显示了如何使用内存屏障,但未提及缓存(在寄存器中,L1,2 ..缓存,主内存).
解决方法:
《 JSR-133食谱》中提到的LoadLoad障碍不仅仅是一些CPU指令.这也是影响JIT编译器的逻辑障碍.特别是,这意味着JIT编译器不会相对于v的负载对x的负载进行缓存或重新排序.
内容总结
以上是互联网集市为您收集整理的关于Java如何在新的内存模型中实现volatile的困惑(JSR 133)全部内容,希望文章能够帮你解决关于Java如何在新的内存模型中实现volatile的困惑(JSR 133)所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。