重新排序指令

时间:2018-03-19 16:24:37

标签: java concurrency

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

  

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

的实例

我无法理解这条线。谁能解释一下呢。这种重新排序将如何发生。我知道thread.start()已经发生在关系之前。

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

int c=0;
int d=1;

可以重新排序为

int d=1;
int c=0;

但是用户解释了如果thread.starts()在关系之前不会发生,那么发布引用可能会被重新排序为变量n(允许)。我无法理解。引用在其他类中,变量n在不同的类中。

1 个答案:

答案 0 :(得分:0)

如果之前没有发生,并且在Holder对象完全初始化之前设置了对public Holder(int n ) { this.n = n; } 的引用,则可能发生这种情况。在这种情况下,我们可以执行一个线程

if (n != n) {
        throw new AssertionError("This statement is false.");
}

另一个正在执行

n

第二个线程读取Unresolved reference: spek的值两次,所以如果我们幸运(或运气不好),第一个线程将在构造函数中执行赋值,然后才会抛出异常。