众所周知,JVM不应该将带有同步块的语句重新排序到同步块之外.考虑到这一点,是否允许JVM重新排序在下面的代码段中y = 7的synchronized块之后发生的分配?
x = 5;
y = 7;
synchronized (this) {
x = 6;
}
Run Code Online (Sandbox Code Playgroud)
我们知道在同步块之前的变量赋值可以重新排序以在块内发生.所以以下内容应该是初始代码的有效重新排序:
x = 5;
synchronized (this) {
x = 6;
y = 7;
}
Run Code Online (Sandbox Code Playgroud)
有人可能会争辩说,因为这是一个有效的排序,y所以在synchronized块之后不能进行赋值,因为它会违反规则,即在块之后不得重新排序来自同步块内的代码并推断出在同步y 结束之前发生的情况.块.
另一方面,可能所有的排序都不等同,而且排序是实际的排序也很重要.具体来说,如果y赋值最初是在同步块内完成的,则在块之后不会发生,否则就可能发生.
总结一下,接下来是订购第一个片段的有效排序吗?
x = 5;
synchronized (this) {
x = 6;
}
y = 7;
Run Code Online (Sandbox Code Playgroud)
- 如果x和y是同一个线程的动作,并且x在程序顺序中出现在y之前,那么hb(x,y).
...
- 如果动作x与后续动作y同步,那么我们也有hb(x,y).
在包含假设值y在当前线程之外可见时,您的问题才有意义.如果是这种情况,则这两个规则的组合要求在同步块之后不重新分配赋值.