首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >重排序指令

重排序指令
EN

Stack Overflow用户
提问于 2018-03-19 16:24:36
回答 1查看 87关注 0票数 0

我知道指令重新排序,但是在下面的链接Will this AssertionError never be thrown in this case?中,在已批准的答案中有一行:

首先,引用的发布是用变量n重新排序的(在此之前没有发生,所以这是允许的)。Thread1创建Holder实例“

我听不懂台词。有人能解释一下吗。这种重新排序是怎么发生的。我知道thread.start()在恋爱之前就已经发生了。

我对java中重新排序的理解是,如果指令在关系之前没有发生,则可以重新排序。

代码语言:javascript
复制
int c=0;
int d=1;

可以重新排序为

代码语言:javascript
复制
int d=1;
int c=0;

但是用户解释说,如果thread.starts()在关系之前不会发生,那么发布引用可能会被变量n重新排序(这是允许的)。我不明白是怎么回事。引用在其他类中,变量n在不同的类中。

EN

回答 1

Stack Overflow用户

发布于 2018-03-19 17:00:14

如果没有发生-在t.holder对象完全初始化之前设置了对Holder的引用,则可能发生这种情况。在这种情况下,我们可以让一个线程执行

代码语言:javascript
复制
public Holder(int n ) {
    this.n = n;
}

另一个正在执行

代码语言:javascript
复制
if (n != n) {
        throw new AssertionError("This statement is false.");
}

第二个线程两次读取n的值,因此如果我们幸运(或不幸运),第一个线程将在构造函数中执行赋值,然后才会抛出这两个读取和异常。

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

https://stackoverflow.com/questions/49367787

复制
相关文章

相似问题

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