首先定义一下java
并发编程中的发布定义:编程
发布就给做用域以外的代码提供引用/对象,例如return操做 或者 将对象当作参数传递给方法使用,
这个现象就是发布并发
并发编程中的逸出:函数
就是在对象的构造器还未执行完成 就发布了对象(不必定就是本身,也多是static修饰的属性或者代码块内部的对象)
给做用域以外的代码使用 的现象this
逸出现象源码线程
public class ObjectPublish { public static HashSet<Person> persons ; public void init() { persons = new HashSet<Person>(); } } 或者在构造器中 直接使用匿名内部类,而后给属性在赋值,这种代码顺序会形成this对象逸出 例如 public class ConstructorEscape { public ConstructorEscape(EventSource eventSource) { eventSource.registerListener( new EventListener(){ public void OnEvent(Event e) { doSomeThing(e); } } ); } }
避免隐式逸出的方式能够使用工厂:code
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引用):对象
一、不要在构造函数中启动新线程,取而代之的是在其余初始化或启动方法中启动对象拥有的线程。
二、千万不要在父类构造方法中调用被子类覆盖的方法。作用域