首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java的同步关键字所要求的缓存刷新的范围是什么?

Java的同步关键字所要求的缓存刷新的范围是什么?
EN

Stack Overflow用户
提问于 2009-05-06 01:46:13
回答 3查看 1.5K关注 0票数 9

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

我似乎无法找到一个明确的答案,那就是在特定的同步中需要缓存失效和刷新的范围。

所有CPU寄存器和缓存必须在输入任何同步代码部分时失效,并且在离开时全部刷新到主RAM,还是JVM只允许使那些变量无效,并且只刷新那些在同步代码块中实际写入的变量?

如果是前者,为什么JMM会坚持认为内存障碍只发生在两个线程之间,而这些线程在完全相同的对象上同步呢?

如果是后者,是否有任何好的文件来解释如何做到这一点的细节?(我假设底层实现必须在同步块开始时在CPU级别设置一个“旁路缓存”标志,并在结束时清除它,但我可能离基很远。)

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-05-11 15:10:00

Java内存模型上有非常好的技术讨论。如果您不喜欢wideos,请在Java模型的上下文中使用google 'happens before'

基本上,如果在关系之前发生的话,其他线程都可以看到所有的写,让我们假设线程A写到字段X,线程B从它读取,那么在建立写和读之间的关系之前就会发生这样的情况:

  • X是易挥发的
  • 对x的写入是由从x读取的同一个锁保护的。
  • 也许还有更多。

所以我认为第二个选项是正确的,他们是如何实现的,我不知道。

票数 5
EN

Stack Overflow用户

发布于 2009-05-06 01:58:35

您需要理解的是,Pre-5.0JMM从来没有真正实现过,因为它实际上并不可行。

所以,在技术上,你必须把所有的东西都写到共享内存中。在1.5 (实际上是1.4),这是放松。特别是,如果锁无法摆脱线程,那么JVM有权将其视为nop。此外,可以合并同一锁的解锁后的锁,这对于旧的JMM不是这样的。对于转义锁,JVM通常必须是悲观的,而且刷新的程度超出了技术上的需要。

票数 1
EN

Stack Overflow用户

发布于 2009-05-06 02:49:18

我建议你先从:

  • Doug的"JSR-133食谱“为编译器编写人员提供如何实现内存模型的信息
  • Java内存模型邮件列表存档中,您可以阅读一些正在传播的论点,这些论点导致了当前对JMM的修订。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/827679

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档