28

我已经根据条件以多种方式开发了单例,例如 volatile/lazy 单例、渴望单例、普通单例以及通过 Enum,但具体来说,我想了解下面显示的静态保持器模式单例。

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

    private Singleton(){}

    public static Singleton getInstance() { 
        return InstanceHolder.instance;
    }
}

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

4

2 回答 2

70

这种模式至少有 3 个原因是有益的:

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

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

静态持有人模式也被认为是双重检查锁定反模式的最聪明的替代品。

于 2014-06-03T14:43:27.440 回答
7

这是一种通过利用 JVM 加载类的方式来制作线程安全的惰性单例的方法。您可以在 Bloch 的 Effective Java 书中阅读更多关于为什么以及如何正确实现它的信息。

请记住,从testable code角度来看,单例(以及一般的全局状态)是无益的,应该避免。

于 2013-02-22T07:57:29.057 回答