对象溢出问题

来源: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回答

Jimin

2018-11-28

你好,这里是“逸出”,不是“溢出”,需要注意一下。这个case的关键是对象还没有构造完成,它的this引用就被发布出去了。这是危及到线程安全的,因为其他线程有可能通过这个逸出的引用访问到“初始化了一半”的对象。这样就会出现某些线程中看到该对象的状态是没初始化完的状态,而在另外一些线程看到的却是已经初始化完的状态,这种不一致性是不确定的,程序也会因此而产生一些无法预知的并发错误。

0
1
qq_灬Mamba磊_0
非常感谢!
2018-12-03
共1条回复

Java高并发编程,构建并发知识体系,提升面试成功率

构建完整并发与高并发知识体系,倍增高薪面试成功率!

3923 学习 · 832 问题

查看课程