对象的发布与逸出
发布(publish) 使对象能够在当前作用域之外的代码中使用
逸出(escape) 当某个不应该发布的对象被发布了
常见逸出的有下面几种方式:
-
静态域逸出
-
public修饰的get方法
-
方法参数传递
-
隐式的this
静态域逸出:
public修饰get方法:
方法参数传递我就不再演示了,因为把对象传递过去给另外的方法,已经是逸出了~
下面来看看该书给出this逸出的例子:
逸出就是本不应该发布对象的地方,把对象发布了。导致我们的数据泄露出去了,这就造成了一个安全隐患!理解起来是不是简单了一丢丢?
安全发布对象
上面谈到了好几种逸出的情况,我们接下来来谈谈如何安全发布对象。
安全发布对象有几种常见的方式:
-
在静态域中直接初始化 :
public static Person = new Person()
;-
静态初始化由JVM在类的初始化阶段就执行了,JVM内部存在着同步机制,致使这种方式我们可以安全发布对象
-
-
对应的引用保存到volatile或者AtomicReferance引用中
-
保证了该对象的引用的可见性和原子性
-
-
由final修饰
-
该对象是不可变的,那么线程就一定是安全的,所以是安全发布~
-
-
由锁来保护
-
发布和使用的时候都需要加锁,这样才保证能够该对象不会逸出
-