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