java - 有效的重新排序 - 在新的 JMM 下

标签 java multithreading concurrency synchronization java-memory-model

我只是想知道下面的重新排序在新的 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/

相关文章:

java - 对象数组的字节数组

c++ - c/c++ epoll 多线程

java - 在 Java 中将可变变量转换为不可变变量并减少痛苦

java - JProgressBar setValue 不起作用,也尝试使用 SwingUtilities

java - 安卓 : Adding tabs below the action bar

java - Eclipse - 悬停不显示抽象 Java 类中的变量

java - Java 类中静态成员的锁定获取

testing - 如何测试 Golang channel /go-routines

java - Java 中的 DefaultListModel 修改作为参数传递给 addElement 方法的 String

java - 使用线程池和 BlockingQueue 重新架构 I/O 密集型 Java Web 服务