Java单例的实现方式及问题(转载 + 整理)

7种主要的实现方式

  1. 懒汉,线程不安全
  2. 懒汉,synchronized
  3. 饿汉,static final域中直接new
  4. 饿汉,static块中直接new (类似3)
  5. Double-check
  6. 静态内部类
  7. Enum

实现代码及关键解释参见我的GitHub Repo.

常见单例实现的几个额外考虑的问题

  1. 可序列化 - 需要重载readResolve()函数,返回同样的实例
    修复办法:(这个我不是很理解, why这么做?)

    1
    2
    3
    4
    5
    6
    7
    private static Class<?> getClass(String className) throws ClassNotFoundException {
    ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
    if(classLoader == null)
    classLoader = SingletonWithStaticNestedClass.class.getClassLoader();
    return (classLoader.loadClass(className));
    }
  2. 不同类加载器加载导致对象不同的问题
    修复办法:

    1
    2
    3
    private Object readResolve() {
    return SingletonHolder.instance;
    }

参考

7种实现方式
双重检查的陷阱和解决方法及原理
Effective way to implement singleton in java