ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

关于Java如何在新的内存模型中实现volatile的困惑(JSR 133)

2019-11-08 18:04:37  阅读:212  来源: 互联网

标签:concurrency volatile jvm java


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体系结构)

barriers correspond to JSR-133 ordering rules

并且硬件使用缓存一致性协议来确保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的负载进行缓存或重新排序.

标签:concurrency,volatile,jvm,java
来源: https://codeday.me/bug/20191108/2009557.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有