Java的synchronize关键字所需的缓存刷新范围是多少?

Law*_*Dol 9 java synchronization

我今天一直在研究Java内存模型,以便详细了解JMM pre-Java 5的问题以及Java 5中实现的JSR-133所做的更改.

我似乎无法找到明确答案的是特定同步所需的缓存失效和刷新的范围.

进入代码的任何同步部分时所有CPU寄存器和高速缓存都必须无效,并且在离开时全部刷新到主RAM,或者JVM是否只允许实际读取的那些变量无效,并且只刷新在同步代码块中实际写入的那些?

如果是前者,为什么JMM如此迂腐,坚持认为内存屏障只发生在同一个对象同步的两个线程之间?

如果是后者,是否有任何好的文件解释了如何实现这一目标的细节?(I将假设底层实现将具有在在同步块的开始CPU级别设定"旁路缓存"标志和结束时清除它,但我可能是方式关闭基地.)

jb.*_*jb. 5

很不错的技术讲座Java内存模型.如果你不喜欢'happens before'在Java内存模型的上下文中使用wideos google .

基本上所有写入对于其他线程都是可见的,如果在关系之前发生,请假设线程A写入字段X,并且线程B从中读取,因此在写入和读取之间建立之前发生如下:

  • x是易变的
  • 写入x是由从x读取的同一个锁保护的
  • 也许还有一些.

所以我认为第二种选择是真的,他们是如何实现它的,我不知道.