首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >java中的同步重新排序

java中的同步重新排序
EN

Stack Overflow用户
提问于 2018-10-15 04:11:38
回答 1查看 177关注 0票数 4

众所周知,JVM不应该将带有同步块的语句重新排序到同步块之外。考虑到这一点,是否允许JVM将赋值y = 7重新排序到以下代码片段中的synchronized块之后?

代码语言:javascript
复制
x = 5;
y = 7;
synchronized (this) {
    x = 6;
}

我们知道,同步块之前的变量赋值可以重新排序,以便在块内发生。因此,以下代码应该是对初始代码的有效重新排序:

代码语言:javascript
复制
x = 5;
synchronized (this) {
    x = 6;
    y = 7;
}

有人可能会争辩说,因为这是一个有效的排序,所以y赋值不能发生在synchronized块之后,因为它会违反来自同步块内的代码不能被重新排序为发生在块之后的规则,并推断y 发生在同步块的结束之前。

另一方面,可能并不是所有的排序都是等价的,哪种排序是实际的排序很重要。具体地说,如果y赋值最初是在synchronized块中完成的,那么它不可能在该块之后发生,否则它就会发生。

总而言之,下一次排序是第一个片段的有效排序吗?

代码语言:javascript
复制
x = 5;
synchronized (this) {
    x = 6;
}
y = 7;
EN

回答 1

Stack Overflow用户

发布于 2018-10-15 04:43:00

是的,你的推理是有缺陷的;这是不可能发生的。

监视器enter类似于volatile load (不完全正确,但我理解它更简单-将插入两个障碍:LoadLoad|LoadStore)和之前不能跨越该障碍的操作。

我很确定,这是由JLS指定的,虽然我想链接到它,但另一个答案已经做到了--去投票吧。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52806674

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档