gpt4 book ai didi

java - 在两个同步块(synchronized block)和多个 volatile 读/写的情况下重新排序

转载 作者:行者123 更新时间:2023-11-29 07:56:13 26 4
gpt4 key购买 nike

考虑下面的情况

Case 1: 
action#1
volatile read var 1
volatile write var 1
volatile read var 2
volatile write var 2
action#2

对于上面的案例 1,我们可以对 action#1 和 action#2 的重新排序说些什么

Case 2:
action#1
synchronized(new Object()){}
synchronized(new Object()){}
action#2

对于上面的案例 2,我们可以对 action#1 和 action#2 的重新排序说些什么。

对于案例 2,我已经有了问题的答案 Is this a better version of Double Check Locking without volatile and synchronization overhead .这个问题的答案说,案例 2 的重新排序在 action#2 和 action#1 之间是可能的,因为 JMM 是一个比 Roach Motel 模型弱的模型。我认为 zhong.j.yu 是对的。

但现在我从以下问题的答案中得到了一些矛盾的东西 Valid reorderings - under new JMM .这显示了一个有点严格的罗奇汽车旅馆模型。

  For Orignal Code

instanceVar1 = value ;// normal read operation, no volatile
synchronized(this) {
instanceVar2 = value2; //normal read operation, no volatile
}
instanceVar3 = value3; //normal read operation, no volatile

The below Ordering is not possible

Case 4:

instanceVar3 = value3; //normal read operation, no volatile
synchronized(this) {
instanceVar2 = value2; //normal read operation, no volatile
}
instanceVar1 = value ;// normal read operation, no volatile

这也来自杰里米曼森的博客文章 http://jeremymanson.blogspot.co.uk/2007/05/roach-motels-and-java-memory-model.html

我还想指出编译器在优化涉及内存屏障的代码时受到限制。请参阅:http://jeremymanson.blogspot.in/2009/06/volatile-arrays-in-java.html其中** arr=arr 一个冗余的读写没有优化,因为arr是一个可变引用**。

我想说的两个问题的答案本质上没有什么矛盾,而且似乎都是对的。问题一:Valid reorderings - under new JMM问题二:Is this a better version of Double Check Locking without volatile and synchronization overhead

我们将如何决定 JMM 在哪一点上比 Roach Motel 模型弱?

最佳答案

问题一:

另一个很好的引用点是 Reodering Grid (我经常在这里引用)。它所说的在这里有用的是 NormalLoad 后跟 MonitorExit 不能重新排序。在这种情况下,instanceVar1 = value ; 的正常加载无法重新排序到 synchronized(this) {

的监视器导出

问题二:

从表面上看,这确实是矛盾的。但它真正的意思是,因为没有其他线程可以与对象同步(因为你正在做 new Object)所以按理说没有必要担心多线程因此能够围绕 synchronized 方法移除和重新排序。

这是基于 Lock Elision 背后的想法。


volatile 自引用读/写——据我所知,volatile store 没有死代码删除,即使它有自己的 store,所以编译器仍然需要遵守 volatile store 的排序规则。

关于java - 在两个同步块(synchronized block)和多个 volatile 读/写的情况下重新排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17534650/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com