我知道指令重新排序,但是在下面的链接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在不同的类中。
发布于 2018-03-19 17:00:14
如果没有发生-在t.holder对象完全初始化之前设置了对Holder的引用,则可能发生这种情况。在这种情况下,我们可以让一个线程执行
public Holder(int n ) {
this.n = n;
}另一个正在执行
if (n != n) {
throw new AssertionError("This statement is false.");
}第二个线程两次读取n的值,因此如果我们幸运(或不幸运),第一个线程将在构造函数中执行赋值,然后才会抛出这两个读取和异常。
https://stackoverflow.com/questions/49367787
复制相似问题