1. 程式人生 > >java併發程式設計筆記----釋出與逸出

java併發程式設計筆記----釋出與逸出

開發十年,就只剩下這套架構體系了! >>>   

首先定義一下

併發程式設計中的釋出定義:

    釋出就給作用域之外的程式碼提供引用/物件,例如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物件給