我只是想知道下面的重新排序在新的 JMM 模型下是否有效
Original Code:
instanceVar1 = value ;// normal read operation, no volatile
synchronized(this) {
instanceVar2 = value2; //normal read operation, no volatile
}
instanceVar3 = value3; //normal read operation, no volatile
以上代码可以重新排序为以下执行。
Case 1:
synchronized(this) {
instanceVar2 = value2; //normal read operation, no volatile
instanceVar1 = value ;// normal read operation, no volatile
}
instanceVar3 = value3; //normal read operation, no volatile
另一种情况:
Case 2:
synchronized(this) {
instanceVar3 = value3; //normal read operation, no volatile
instanceVar2 = value2; //normal read operation, no volatile
instanceVar1 = value ;// normal read operation, no volatile
}
另一种情况:
Case 3:
instanceVar3 = value3; //normal read operation, no volatile
synchronized(this) {
instanceVar2 = value2; //normal read operation, no volatile
instanceVar1 = value ;// normal read operation, no volatile
}
另一种情况:
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
以上 4 种情况是否都是新 JMM 模型下原始代码的有效重新排序。 我已经根据我的理解给出了上述所有重新排序 http://gee.cs.oswego.edu/dl/jmm/cookbook.html
最佳答案
考虑如何使用监视器进入和退出对正常加载/存储进行重新排序:
案例 1 使用监视器输入重新排序正常的加载/存储,这是一个有效的重新排序。
案例 2 使用监视器输入重新排序正常加载/存储,监视器退出后跟正常加载/存储,这些都是有效的重新排序。
查看类似示例:Roach Motels and Java Memory Model .这表明访问可以移入同步块(synchronized block)但不能再次退出。
案例 3 和 4 重新排序监视器输入,然后是无效的正常加载/存储。
关于java - 有效的重新排序 - 在新的 JMM 下,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17505830/