this逃逸

时间:2021-03-31 19:27:25   收藏:0   阅读:27

什么是this逃逸?

  this逃逸是指在构造函数返回之前,其他线程持有了该对象的引用。

  因为构造函数在构造一个对象,或者说new一个新对象的时候,有一个中间过程,称为半初始化过程,对象在初始化的时候发生了指令重排,导致当前对象还是默认值的时候就和对象句柄建立了连接,而这个对象在这个时候被其他线程读走了,相当于获取了错误的值。

  

该情况多发生在构造器中启动线程或者注册监听器的时候。

错误示范:

public class ThisEscape {
    private String value = "";

    public ThisEscape() {
        new Thread(new TestDemo()).start();
        this.value = "this escape";
    }

    public class TestDemo implements Runnable {
        @Override
        public void run() {
            /** * 这里是可以通过ThisEscape.this调用外围类对象的,但是测试外围累对象可能还没有构造完成, * 所以会发生this逃逸现象 */
            System.out.println(ThisEscape.this.value);
        }
    }
}

正确写法:

public class FixThisEscape {
    private String value = "";
    private Thread thd;

    public FixThisEscape() {
        /** * 构造函数中可以创建Thread对象,但是不要启动,另外使用start方法启动线程 */
        thd = new Thread(new TestDemo());
        this.value = "this escape";
    }

    public void start() {
        thd.start();
    }

    public class TestDemo implements Runnable {
        @Override
        public void run() {
            System.out.println(FixThisEscape.this.value);
        }
    }
}

 

原文:https://www.cnblogs.com/karbon/p/14602329.html

评论(0
© 2014 bubuko.com 版权所有 - 联系我们:wmxa8@hotmail.com
打开技术之扣,分享程序人生!