上代码!!!!!!!!!!
public class FinalReferenceEscapeExample {
final int i;
static FinalReferenceEscapeExample obj;
public FinalReferenceEscapeExample () {
i = 1; //1写final域
obj = this; //2 this引用在此“逸出”
}
public static void writer() {
new FinalReferenceEscapeExample ();
}
public static void reader {
if (obj != null) { //3
int temp = obj.i; //4
}
}
}
假设有两个线程,一个线程A执行writer()方法,另一个线程B执行reader()方法。
这里的操作2使得对象还未完成构造前就为线程B可见。即使这里的操作2是构造函数的最后一步,并在程序中操作2排在操作1后面,执行read()方法的线程仍然可能无法看到final域被初始化后的值,因为在构造函数返回前,被构造对象的引用不能为其他线程可见,此时的final域可能还没有被初始化