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对象中

  • 将对象的引用保存到一个由锁保护的域中

将对象的引用保存到一个由锁保护的域中

将对象的引用保存到某个正确构造函数对象的final类型域

Last updated

Was this helpful?