gpt4 book ai didi

java - Bill Pugh 解决方案相对于延迟初始化单例解决方案有什么优势?

转载 作者:行者123 更新时间:2023-11-30 02:02:28 31 4
gpt4 key购买 nike

比尔普格解决方案

public class ThreadSafeSerializedSafeSingleton implements Serializable {

private ThreadSafeSerializedSafeSingleton() {
}

private static class SingletonHelper {
private static final ThreadSafeSerializedSafeSingleton instance = new ThreadSafeSerializedSafeSingleton();
}

public static ThreadSafeSerializedSafeSingleton getInstance() {
return SingletonHelper.instance;
}

}

VS

延迟初始化线程安全单例

public class ThreadSafeSingleton {

private static ThreadSafeSingleton instance;

private ThreadSafeSingleton() {
}

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

}

最佳答案

Bill Pugh 的解决方案相对于所提出的延迟初始化单例实现的优势与性能相关。考虑下一个场景。

实例已初始化并且两个线程同时请求该实例

  • 对于惰性初始化实现,由于该方法是同步的,因此其中一个线程将阻塞。
  • 对于 Bill Pugh 的实现,不会出现任何阻塞。

无论如何,这可以通过双重检查锁定实现单例来(部分)缓解。请参阅下面的示例。

双重检查锁定单例:

public final class DoubleCheckedLockingSingleton {

private static volatile DoubleCheckedLockingSingleton instance;

private DoubleCheckedLockingSingleton(){
if(instance!=null)
throw new RuntimeException();
}

public static final DoubleCheckedLockingSingleton getInstance(){
if(instance==null){
synchronized(DoubleCheckedLockingSingleton.class) {
if(instance==null)
instance = new DoubleCheckedLockingSingleton();
}
}
return instance;
}

}

在这种情况下,性能差异并不显着。双重检查锁定实现和持有者模式实现之间的主要区别在于其工作原理。

  • 双重检查锁定:线程仅在同时触发实例创建时才会阻塞。您必须重新检查同步块(synchronized block)内的 instance == null ,因为两个线程可能(虽然可能性很小,但最好的 bug)在第一个 if 和同步块(synchronized block)之间交换。您还必须声明变量 volatile ,以便利用 JMM 对 volatile 的“发生在”保证(因此您可以确定 instance==null 检查不会返回 false,直到实例>完全初始化)。
  • 持有者模式:线程只有在同时触发实例创建时才会阻塞。您所需要知道的是,Java 中的类是通过 JVM 的锁定来延迟加载的(因此锁定和可见性都是开箱即用的,无需您进行任何额外的工作)。

就我个人而言,我更喜欢持有者模式而不是双重检查锁定,因为它工作的原因似乎更容易理解(至少对我来说)。

最后一点,如果您的需求允许(即,如果您使用 DI 框架,例如 Spring),实现单例的最佳方法是让 Spring 为您提供单例(通过使用 @Component 具有默认的单例范围)。

关于java - Bill Pugh 解决方案相对于延迟初始化单例解决方案有什么优势?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52381096/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com