请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

对象溢出问题

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引用就被发布出去了。这是危及到线程安全的,因为其他线程有可能通过这个逸出的引用访问到“初始化了一半”的对象。这样就会出现某些线程中看到该对象的状态是没初始化完的状态,而在另外一些线程看到的却是已经初始化完的状态,这种不一致性是不确定的,程序也会因此而产生一些无法预知的并发错误。

0 回复 有任何疑惑可以回复我~
问题已解决,确定采纳
还有疑问,暂不采纳
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号