根据操作中的Java并发,如果我们有以下类:
public class Wrapper {
private int num;
public Wrapper(int num) {
this.num = num;
}
public void assertCorrectness() {
if (num != num)
throw new AssertionError("This is false");
}
}
我们初始化这个类的一个实例,并以非安全的方式(例如通过一个简单的公共字段)发布它,那么如果从另一个线程调用,assertCorrectness()可能确实会抛出一个AssertionError.换句话说,这意味着另一个线程可能会看到对实例的最新引用,但实例本身的状态可能已过期(因此线程可以看到对象存在,但它处于部分构造/不一致的状态).
另一方面,据说通过易失性引用发布此类的实例被认为是安全的.然而,我的理解是,Volatile只是保证任何线程都将始终看到引用的最新版本,而不是被引用的对象的状态.因此,我们可以确定,如果一个线程将包装器类的新实例分配给一个可变字段,那么所有其他线程都将看到该引用已更新.但是,他们是否仍然会看到处于不一致/部分构造状态的对象呢?