我今天一整天都在研究Java内存模型,以便详细了解JMM预Java 5的问题以及在Java 5中实现的JSR-133所做的更改。
我似乎无法找到一个明确的答案,那就是在特定的同步中需要缓存失效和刷新的范围。
所有CPU寄存器和缓存必须在输入任何同步代码部分时失效,并且在离开时全部刷新到主RAM,还是JVM只允许使那些变量无效,并且只刷新那些在同步代码块中实际写入的变量?
如果是前者,为什么JMM会坚持认为内存障碍只发生在两个线程之间,而这些线程在完全相同的对象上同步呢?
如果是后者,是否有任何好的文件来解释如何做到这一点的细节?(我假设底层实现必须在同步块开始时在CPU级别设置一个“旁路缓存”标志,并在结束时清除它,但我可能离基很远。)
发布于 2009-05-11 15:10:00
在Java内存模型上有非常好的技术讨论。如果您不喜欢wideos,请在Java模型的上下文中使用google 'happens before'。
基本上,如果在关系之前发生的话,其他线程都可以看到所有的写,让我们假设线程A写到字段X,线程B从它读取,那么在建立写和读之间的关系之前就会发生这样的情况:
所以我认为第二个选项是正确的,他们是如何实现的,我不知道。
发布于 2009-05-06 01:58:35
您需要理解的是,Pre-5.0JMM从来没有真正实现过,因为它实际上并不可行。
所以,在技术上,你必须把所有的东西都写到共享内存中。在1.5 (实际上是1.4),这是放松。特别是,如果锁无法摆脱线程,那么JVM有权将其视为nop。此外,可以合并同一锁的解锁后的锁,这对于旧的JMM不是这样的。对于转义锁,JVM通常必须是悲观的,而且刷新的程度超出了技术上的需要。
发布于 2009-05-06 02:49:18
我建议你先从:
https://stackoverflow.com/questions/827679
复制相似问题