对象的发布与逸出

发布(publish) 使对象能够在当前作用域之外的代码中使用

逸出(escape) 当某个不应该发布的对象被发布了

 

常见逸出的有下面几种方式:

  • 静态域逸出

  • public修饰的get方法

  • 方法参数传递

  • 隐式的this

 

静态域逸出:

 

public修饰get方法:

 

方法参数传递我就不再演示了,因为把对象传递过去给另外的方法,已经是逸出了~

 

下面来看看该书给出this逸出的例子

 

逸出就是本不应该发布对象的地方,把对象发布了。导致我们的数据泄露出去了,这就造成了一个安全隐患!理解起来是不是简单了一丢丢?

安全发布对象

上面谈到了好几种逸出的情况,我们接下来来谈谈如何安全发布对象

安全发布对象有几种常见的方式:

  • 在静态域中直接初始化 : public static Person = new Person();

    • 静态初始化由JVM在类的初始化阶段就执行了,JVM内部存在着同步机制,致使这种方式我们可以安全发布对象

  • 对应的引用保存到volatile或者AtomicReferance引用中

    • 保证了该对象的引用的可见性和原子性

  • 由final修饰

    • 该对象是不可变的,那么线程就一定是安全的,所以是安全发布~

  • 由锁来保护

    • 发布和使用的时候都需要加锁,这样才保证能够该对象不会逸出