首页 > 解决方案 > 关于线程安全设计中使用的逻辑的问题?

问题描述

下面是线程安全设计的代码片段。为什么我们要检查instance = null同步块之前和内部?在外面检查还不够吗?

// double locking is used to reduce the overhead of the synchronized method
public static ThreadSafeSingleton getInstanceDoubleLocking() {
    if (instance == null) {
        synchronized (ThreadSafeSingleton.class) {
            if (instance == null) {
                instance = new ThreadSafeSingleton();
            }
        }
    }
    return instance;
}

标签: javadesign-patternsthread-safety

解决方案


它称为单例模式中的双重检查
让我们假设第一个线程进入方法检查实例是否为空,如果是,它将获取锁并开始创建对象。

假设当第一个线程仍在创建实例(可能是一个重的对象)时,同时另一个线程可能进入它检查实例是否为空的方法,因为第一个线程仍在创建资源并拥有锁,现在首先线程创建对象释放锁,第二个线程进入同步块并检查实例现在不为空条件失败并且它从方法中出来。因此仅在实例上存在。更多细节

https://www.java67.com/2015/09/thread-safe-singleton-in-java-using-double-checked-locking-pattern.html


推荐阅读