我已经在很多方面开发了单例,这取决于像易失性/懒惰单例,急切单例,普通单例和通过Enum这样的条件,但具体来说我想知道下面所示的静态持有者模式单例。
public static class Singleton {
private static class InstanceHolder {
public static Singleton instance = new Singleton();
}
private Singleton(){}
public static Singleton getInstance() {
return InstanceHolder.instance;
}
}
请告知哪些条件有益,哪些有益。
答案 0 :(得分:52)
这种模式至少有三个原因:
JVM推迟初始化InstanceHolder类,直到实际使用它为止,并且因为使用静态初始化程序初始化Singleton,所以不需要额外的同步。任何线程对 getInstance 的第一次调用都会导致InstanceHolder被加载和初始化,此时Singleton的初始化通过静态初始化器发生。
静态持有者模式也被认为是Double-check-locking反模式的最明智的替代品。
答案 1 :(得分:5)
这是一种通过利用JVM加载类的方式来创建线程安全的懒惰单例的方法。您可以在Bloch的Effective Java书中详细了解为何以及如何正确实现它。
请记住,从testable code
角度来看,单身人士(以及一般的全球状态)并不是有益的,应该避免。