关于静态支架单例模式

use*_*103 20 java

我已经在很多方面开发了单例,这取决于像易失性/懒惰单例,急切单例,普通单例和通过Enum这样的条件,但具体来说我想知道下面所示的静态持有者模式单例.

public static class Singleton {
    private static class InstanceHolder {
        public static Singleton instance = new Singleton();
    }

    private Singleton(){}

    public static Singleton getInstance() { 
        return InstanceHolder.instance;
    }
}
Run Code Online (Sandbox Code Playgroud)

请告知在哪些条件下它是有益的,有什么好处.

Vla*_*aly 56

这种模式至少有三个原因:

  1. 静电厂
  2. 延迟初始化
  3. 线程安全

JVM推迟初始化InstanceHolder类,直到实际使用它为止,并且因为使用静态初始化程序初始化Singleton,所以不需要额外的同步.任何线程对getInstance的第一次调用都会导致InstanceHolder被加载和初始化,此时Singleton的初始化通过静态初始化器发生.

静态支架图案也被认为是双重检查锁定反模式的最明智的替代品.

  • +1实际上回答OP的"有什么好处"的问题. (7认同)
  • “并且因为单例是用静态初始化程序初始化的,所以不需要额外的同步” - 我对这个声明很好奇。在幕后,JVM 必须进行同步以确保不存在竞争,对吧? (2认同)

den*_*nko 6

这是一种通过利用JVM加载类的方式来创建线程安全的懒惰单例的方法.您可以在Bloch的Effective Java书中详细了解为何以及如何正确实现它.

请记住,从testable code单身人士(以及一般的全球状态)的角度来看,这并不是有益的,应该避免.