首先定義一下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引用):對象
一、不要在構造函數中啓動新線程,取而代之的是在其餘初始化或啓動方法中啓動對象擁有的線程。
二、千萬不要在父類構造方法中調用被子類覆蓋的方法。作用域