首先定义一下
并发编程中的发布定义:
发布就给作用域之外的代码提供引用/对象,例如return操作 或者 将对象当做参数传递给方法使用,
这个现象就是发布
并发编程中的逸出:
就是在对象的构造器还未执行完成 就发布了对象(不一定就是自己,也可能是static修饰的属性或者代码块内部的对象)
给作用域之外的代码使用 的现象
逸出现象源码
避免隐式逸出的方式可以使用工厂:
package com.codeartist;
public class ConstructorEscape {
private final EventListener listener;
private ConstructorEscape()
{
this.listener= new EventListener(){
public void OnEvent(Event e)
{
doSomeThing(e);
}
}; //这里将发布的对象 给的作用域内的代码使用
}
public static ConstructorEscape getInstance(EventSource eventSource)
{
ConstructorEscape instance = new ConstructorEscape();
eventSource.registerListener(instance.listener);
return instance;
}
}
普通的逸出处理(含this引用):
1、不要在构造函数中启动新线程,取而代之的是在其他初始化或启动方法中启动对象拥有的线程。
2、千万不要在父类构造方法中调用被子类覆盖的方法。