首先定义一下

并发编程中的发布定义:

    发布就给作用域之外的代码提供引用/对象,例如return操作 或者 将对象当做参数传递给方法使用,
    这个现象就是发布

并发编程中的逸出:

    就是在对象的构造器还未执行完成 就发布了对象(不一定就是自己,也可能是static修饰的属性或者代码块内部的对象)
    给作用域之外的代码使用  的现象

逸出现象源码

避免隐式逸出的方式可以使用工厂:

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引用):

1、不要在构造函数中启动新线程,取而代之的是在其他初始化或启动方法中启动对象拥有的线程。
2、千万不要在父类构造方法中调用被子类覆盖的方法。


 

03-07 02:01