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)