7种主要的实现方式
- 懒汉,线程不安全
- 懒汉,synchronized
- 饿汉,static final域中直接new
- 饿汉,static块中直接new (类似3)
- Double-check
- 静态内部类
- Enum
实现代码及关键解释参见我的GitHub Repo.
常见单例实现的几个额外考虑的问题
可序列化 - 需要重载readResolve()函数,返回同样的实例
修复办法:(这个我不是很理解, why这么做?)1234567private static Class<?> getClass(String className) throws ClassNotFoundException {ClassLoader classLoader = Thread.currentThread().getContextClassLoader();if(classLoader == null)classLoader = SingletonWithStaticNestedClass.class.getClassLoader();return (classLoader.loadClass(className));}不同类加载器加载导致对象不同的问题
修复办法:123private Object readResolve() {return SingletonHolder.instance;}
参考
7种实现方式
双重检查的陷阱和解决方法及原理
Effective way to implement singleton in java