5.1安全发布对象
名称解释
发布对象:使一个对象可以被当前范围之外的代码所使用。
对象溢出:一种错误的发布。当一个对象还没有构造完成时,就使他被其他线程所见
代码演示
错误的发布对象示例
package com.moluo.concurrency.publish;
import java.util.Arrays;
public class UnsafePublishExample {
private String[] states = {"a", "b", "c"}; // 使用private关键字修饰states变量,意图该变量无法被修改
public String[] getStates() {
return states;
}
public static void main(String[] args) {
UnsafePublishExample unsafePublishExample = new UnsafePublishExample();
System.out.println(Arrays.toString(unsafePublishExample.getStates()));
unsafePublishExample.getStates()[0] = "d"; // 但仍然被修改
System.out.println(Arrays.toString(unsafePublishExample.getStates()));
}
}对象溢出示例
安全发布对象的四种方法
在
静态初始化函数中初始化一个对象引用将对象的引用保存到
volatile类型域或者AtomicReference对象中将对象的引用保存到某个
正确构造函数对象的final类型域中将对象的引用保存到一个由
锁保护的域中
下面我们通过单例来演示安全发布对象的四种方法
在静态初始化函数中初始化一个对象引用
静态初始化函数中初始化一个对象引用将对象的引用保存到volatile类型域或者AtomicReference对象中
volatile类型域或者AtomicReference对象中将对象的引用保存到一个由
锁保护的域中
将对象的引用保存到一个由锁保护的域中
锁保护的域中将对象的引用保存到某个正确构造函数对象的final类型域中
正确构造函数对象的final类型域中Last updated
Was this helpful?