java併發程式設計筆記----釋出與逸出
阿新 • • 發佈:2019-03-06
首先定義一下
併發程式設計中的釋出定義:
釋出就給作用域之外的程式碼提供引用/物件,例如return操作 或者 將物件當做引數傳遞給方法使用,
這個現象就是釋出
併發程式設計中的逸出:
就是在物件的構造器還未執行完成 就釋出了物件(不一定就是自己,也可能是static修飾的屬性或者程式碼塊內部的物件)
給作用域之外的程式碼使用 的現象
逸出現象原始碼
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); } } ); } }
避免隱式逸出的方式可以使用工廠:
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; } }
普通的逸出。可以將屬性private 或者在構造器中 先處理當前作用域範圍內的邏輯,然後再return物件給