4

我只是想知道以下重新排序在新 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的理解,我已经对上述所有重新排序

4

1 回答 1

2

考虑如何在监视器进入和退出时重新排序正常的加载/存储:

案例 1 使用一个有效的重新排序的监视器输入重新排序正常的加载/存储。

案例 2 重新排序正常的加载/存储,监视器进入,监视器退出,然后是正常的加载/存储,这是有效的重新排序。

请参阅类似示例:Roach Motels 和 Java 内存模型。这表明访问可以移动到同步块中,但不能再次退出。

情况 3 和 4 重新排序监视器输入,然后是无效的正常加载/存储。

于 2013-07-07T12:43:53.017 回答