【发布时间】:2009-05-06 01:46:13
【问题描述】:
我今天整天研究Java内存模型,以详细了解Java 5之前的JMM存在的问题以及Java 5中实现的JSR-133所做的更改。
我似乎找不到明确的答案是特定同步所需的缓存失效和刷新的范围。
在进入任何同步代码部分时必须使所有 CPU 寄存器和缓存无效,并在离开时全部刷新到主 RAM,或者 JVM 是否允许仅使实际读取的变量无效,并仅刷新在同步块期间实际写入的变量代码?
如果是前者,为什么 JMM 如此迂腐地坚持只在两个线程之间发生内存屏障,而这两个线程在完全相同的对象上同步?
如果是后者,是否有任何好的文档来解释如何完成此操作的详细信息? (我认为底层实现必须在同步块开始时在 CPU 级别设置“绕过缓存”标志并在结束时清除它,但我可能方式偏离基础。 )
【问题讨论】:
标签: java synchronization