java併發編程筆記----發佈與逸出

首先定義一下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引用):對象

一、不要在構造函數中啓動新線程,取而代之的是在其餘初始化或啓動方法中啓動對象擁有的線程。
二、千萬不要在父類構造方法中調用被子類覆蓋的方法。作用域

相關文章
相關標籤/搜索