java - Java 编译器是否可以重新排序同步语句以进行优化?

标签 java multithreading

同步语句是否可以重新排序。 IE : 可以:

synchronized(A) {
   synchronized(B) {
     ......
   }
}

成为:

synchronized(B) { 
    synchronized(A) { 
     ...... 
     }  
}

最佳答案

Can the synchronization statements be reordered?

我假设您是在询问编译器是否可以重新排序 synchronized block ,以便锁定顺序与代码的顺序不同。

答案是否定的。 synchronized block (和 volatile 字段访问)对编译器施加顺序限制。在您的情况下,您不能在另一个监视器进入之前移动监视器进入,也不能在另一个监视器退出之后移动监视器退出。请参阅下面的网格。

引自JSR 133 (Java Memory Model) FAQ :

It is not possible, for example, for the compiler to move your code before an acquire or after a release. When we say that acquires and releases act on caches, we are using shorthand for a number of possible effects.

Doug Lea 的 JSR-133 Cookbook有一个显示重新排序可能性的网格。网格中的空白条目表示允许重新排序。在您的情况下,进入 synchronized block 是“MonitorEnter”(与加载 volatile 字段相同的重新排序限制)并退出 synchronized block 是一个“MonitorExit”(与存储到 volatile 字段相同)。

enter image description here

关于java - Java 编译器是否可以重新排序同步语句以进行优化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19215948/

相关文章:

c# - C#中异步套接字类的设计

java - Java EE 服务器中的自己的线程 - 最先进的技术

java - JSON日期到Java日期?

java - 如何在 Hibernate 中使用 Contains

java - 创建用于发送电子邮件的后台线程

c# - 使表格在函数C#中可用

java - 跨多个线程访问字符串

java - LinkedList.subList(int, int) 的时间复杂度

java - 如何在 Spring 测试中仅重新创建选定的 Spring 上下文?

java - 即使已定义变量,也无法识别变量