今天一整天都在研究Java内存模型,为了详细了解JMM pre-Java 5的问题以及Java 5实现的JSR-133所做的更改。
我似乎无法找到明确答案的是特定同步所需的缓存失效和刷新范围。
当进入代码的任何同步部分时,所有 CPU 寄存器和缓存都必须无效,并在离开时全部刷新到主 RAM,或者是否允许 JVM 仅使实际读取的变量无效,并且仅刷新在同步块(synchronized block)期间实际写入的变量代码?
如果是前者,为什么 JMM 如此迂腐地坚持认为内存屏障只发生在同步完全相同对象的两个线程之间?
如果是后者,是否有任何好的文档解释如何实现这一点的细节? (我假设底层实现必须在同步块(synchronized block)开始时在 CPU 级别设置一个“旁路缓存”标志,并在结束时清除它,但我可能方式偏离基础。 )
最佳答案
Java Memory model 上有非常好的 技术讲座.如果您不喜欢 Java 内存模型上下文中的 wideos google 'happens before'
。
基本上所有的写入对其他线程都是可见的,如果有 happens before 关系,让我们假设线程 A 写入字段 X,线程 B 从它读取,所以 happens before 在写入和读取之间建立结束,如果:
- x 是不稳定的
- 写入 x 的锁与读取 x 的锁相同
- 也许更多。
所以我认为第二个选项是正确的,他们是如何实现的,我不知道。
关于java - Java synchronized 关键字要求的缓存刷新范围是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/827679/