参考文献
41 | 单例模式(上):为什么说支持懒加载的双重检测不比饿汉式更优?
42 | 单例模式(中):我为什么不推荐使用单例模式?又有何替代方案?<br>
43 | 单例模式(下):如何设计实现一个集群环境下的分布式单例模式?<br>
实现方式
饿汉式
线程安全
不支持延迟加载
占用内存不会释放
懒汉式
线程不安全
支持延迟加载
线程安全会加锁,导致效率低下
双重检测
低版本JDK存在重排序问题,加volatile关键字即可
高版本已解决该问题
线程安全,高效率,支持延迟加载
静态内部类
线程安全
只有当调用 getInstance() 方法时,SingletonHolder 才会被加载,这个时候才会创建 instance。instance 的唯一性、创建过程的线程安全性,都由 JVM 来保证
延迟加载
SingletonHolder 是一个静态内部类,当外部类 IdGenerator 被加载的时候,并不会创建 SingletonHolder 实例对象
单例存在的缺点
单例会隐藏类之间的依赖关系
调用单例方法,并不知道该方法具体依赖了那些类,执行了那些操作,只有查看代码才知道
单例对代码的扩展性不好
从单例变到多例模式比较复杂
如从单数据源配置到多数据源配置
单例对代码的可测试性不友好<br>
无法使用依赖注入,无能灵活的替换掉可测试类
多个测试用例共享一个单例对象,之间可能会互相影响
不支持有参构造<br>
集群唯一
使用文件存储或者redis等第三方介质作为公共资源获取