我只想知道下面的重新排序在新的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以上四种情况都是在新的JMM模型下对原始代码进行有效的重新排序吗?基于我对http://gee.cs.oswego.edu/dl/jmm/cookbook.html的理解,我给出了上述所有的重新排序
发布于 2013-07-07 20:43:53
考虑正常的加载/存储是如何在监视器进入和退出时重新排序的:
情况1使用监视器enter对正常的加载/存储进行重新排序,这是一种有效的重新排序。
情况2使用监视器enter对正常加载/存储进行重新排序,并在监视器退出之后进行正常加载/存储,这些都是有效的重新排序。
请看一个类似的例子:Roach Motels and Java Memory Model。这表明可以将访问移动到同步块中,但不能再次移出。
情况3和4对监视器enter重新排序,然后是无效的正常加载/存储。
https://stackoverflow.com/questions/17505830
复制相似问题