使用双重检查锁定来实现单例时是否需要波动?]

问题描述 投票:2回答:1

假设我们使用双重检查锁来实现单例模式:

    private static Singleton instance;

    private static Object lock = new Object();

    public static Singleton getInstance() {
        if(instance == null) {
            synchronized (lock) {
                if(instance == null) {
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }

我们需要将变量“ instance”设置为“ volitile”吗?我听到一句话说我们需要它来禁用重新排序:

创建对象时,可能会发生重新排序:

address=alloc
instance=someAddress
init(someAddress)

他们说,如果对最后两个步骤进行了重新排序,我们需要一个经过训练的实例来禁用重新排序,否则其他线程可能会得到未完全初始化的对象。

但是由于我们处于同步代码块中,我们真的需要挥发吗?还是一般来说,我是否可以说同步块可以保证共享变量对其他线程是透明的,即使它不是volatile变量也不会重新排序?

假设我们使用双重检查锁来实现单例模式:私有静态单例实例;私有静态对象锁= new Object();公共静态单例getInstance(){...

java singleton synchronized volatile
1个回答
4
投票

在进行这种解释之前,您需要了解编译器所做的一种优化(我的解释非常简化)。假设在代码的某个地方有这样一个序列:

© www.soinside.com 2019 - 2024. All rights reserved.