对象溢出问题
来源:2-1 案例环境初始化
qq_灬Mamba磊_0
2018-11-27
public class Escape {
private Integer thisCanBeEscape = 0;
public Escape () {
new InnerClass();
thisCanBeEscape = null;
}
//内部类构造方法调用外部类的私有域
private class InnerClass {
public InnerClass() {
log.info("{}", Escape.this.thisCanBeEscape);
}
}
public static void main(String[] args) {
new Escape();
}
}
对这段代码的分析有那么一句话不是太懂,‘上述代码在函数构造过程中启动了一个线程。无论是隐式的启动还是显式的启动,都会造成这个this引用的溢出。新线程总会在所属对象构造完毕之前就已经看到它了’ 这句话里的 ‘函数构造过程中启动了一个线程’ 这个线程是主线程嘛 代码里我没看到其他的线程了
写回答
1回答
-
你好,这里是“逸出”,不是“溢出”,需要注意一下。这个case的关键是对象还没有构造完成,它的this引用就被发布出去了。这是危及到线程安全的,因为其他线程有可能通过这个逸出的引用访问到“初始化了一半”的对象。这样就会出现某些线程中看到该对象的状态是没初始化完的状态,而在另外一些线程看到的却是已经初始化完的状态,这种不一致性是不确定的,程序也会因此而产生一些无法预知的并发错误。
012018-12-03
相似问题