JAVA并发编程笔记四


发布一个对象的意思是使它能够被当前范围之外的代码所使用。比如将一个引用存储到其他代码可以访问的地方,在一个非私有的方法中返回这个引用,也可以把它传递到其他类的方法中。在很多情况下,我们需要确保对象及它

们的内部状态不被暴露。

一个对象在尚未准备好时就将它发布,这种情况称作逸出。

1. 发布最简单的就是将对象设置到公共静态域中
下面一个发布的代码

public static Set<Secret> knownSecret;
public void initialize(){
  knownSecret = new HashSet<Secret>();
}
2.发布第二种简单的方式就是在一个公共方法内直接return 对象的引用
一个数据逸出的例子(不要这样做)

class UnsafeStates{
 private String[] states = new String[]{"CHINA","AMERICAN"};
 public String[] getStates(){ return states; }
}
以这种方式发布states会出现问题。任何一个调用者可以对数据进行修改,本应该是私有的数据变成了公有的了。
3.第三种的发布就很隐秘了.就是讲自身的对象引用发布到另一个对象的引用中.
可能在构造中出现如此这就是this例如:

public class Test {
 
    private boolean isIt;
 
    public Test() throws InterruptedException {
        new Thread(new Runnable() {
            public void run() {
                System.out.println(isIt);
            }
        }).start();
        Thread.sleep(2000L);
        isIt = true;
    }
 
    public static void main(String[] args) throws InterruptedException {
        Test test = new Test();
    }
}

打印的结果是false,这个例子就是隐式的this对象引用逸出,还没有实例化完成时,其他线程就已经要用到对象中的属性
参考了stackoverflow上的文章,理解了什么是构造过程中this引用逸出。
http://stackoverflow.com/questions/1588420/how-does-this-escape-the-constructor-in-java


安全构建的实践
1.不要让this引用在构造期间逸出。
使用工厂方法防止this引用在构造器间逸出。

public class SafeListener{
    private final EventListener listener;

    private SafeListener()
    {
       listener = new EventListener(){
          public void onEvent(Event e){
		doSomething(e);
	  }
	};
    }
    public static SafeListener newInstance(EventSource source){
	SafeListener safe = new SafeListener();
	source.register(safe.listener);
	return safe;
    }
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值