我知道指令重新排序,但在以下链接中 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在不同的类中。
答案 0 :(得分:0)
如果之前没有发生,并且在Holder
对象完全初始化之前设置了对public Holder(int n ) {
this.n = n;
}
的引用,则可能发生这种情况。在这种情况下,我们可以执行一个线程
if (n != n) {
throw new AssertionError("This statement is false.");
}
另一个正在执行
n
第二个线程读取Unresolved reference: spek
的值两次,所以如果我们幸运(或运气不好),第一个线程将在构造函数中执行赋值,然后才会抛出异常。