【发布时间】:2019-03-19 06:54:05
【问题描述】:
众所周知,JVM 不应该将语句从同步块重新排序到同步块之外。考虑到这一点,是否允许 JVM 重新排序分配 y = 7 以发生在以下 sn-p 中的 synchronized 块之后?
x = 5;
y = 7;
synchronized (this) {
x = 6;
}
我们知道,同步块之前的变量赋值可以重新排序以发生在块内。所以以下应该是对初始代码的有效重新排序:
x = 5;
synchronized (this) {
x = 6;
y = 7;
}
有人可能会争辩说,因为这是一个有效的排序,y 分配不能发生在 synchronized 块之后,因为它违反了来自同步块中的代码不得重新排序以发生在块之后的规则,并且推断出同步块的y happens-before end。
另一方面,可能所有的排序都不等价,哪个排序才是实际排序很重要。具体来说,如果 y 分配最初是在同步块内完成的,则它不能在该块之后发生,否则它可以。
综上所述,next ordering是第一个sn-p的有效排序吗?
x = 5;
synchronized (this) {
x = 6;
}
y = 7;
【问题讨论】:
-
在互联网上漫游后,我很确定我在这里的推理是有缺陷的
-
当前形式的代码 sn-ps 看起来像
x和y是方法局部变量,即使您可能的意思是它们是多个线程可以访问的非私有字段? -
是的,我不知道,我已经修复了示例
标签: java synchronized