“ 为什么说支持懒加载的双重检测不比饿汉式更优?”
单例模式
一个类只允许创建一个对象(或实例),即单例模式
为什么使用单例:
- 处理资源访问冲突
- 表示全局唯一类,从业务概念上,有些数据在系统种只应该保存一份,就比较适合设计为单例类。
实现一个单例
- 构造函数需要是private访问权限的,这样才能避免外部通过new创建实例
- 考虑对象创建时的线程安全问题
- 考虑是否支持延迟加载
- 考虑getInstance()性能是否高、是否加锁
- 饿汉式
在类加载的时候,instance静态实例就已经创建饼初始化好了,所以instance实例的创建是线程安全的。不过这样的实现方式不支持延迟加载(即在真正用到时再创建实例)
- 懒汉式
懒汉式相对于饿汉式的优势时支持延迟加载,但给getInstance()加了所,会导致这个函数的并发度很低,如果这个函数被频繁用到,那频繁加锁、释放锁及并发度低等问题,会导致性能瓶颈。
- 双重检测
饿汉式不支持延迟加载,懒汉式有性能问题不支持高并发。双重检测既支持延迟加载又支持高并发;在这种实现方式种,只要instance被创建即便再调用getInstance()函数也不会再进入到加锁逻辑中了,所以这种实现方式解决了懒汉式并发度低的问题
单例存在的问题
大部分情况下,我们在项目中使用单例,都是用它来表示一些全局唯一类,比如配置信息类、连接池类、ID生成器类。单例模式不需要创建对象,直接通过类似getInstance()的方法就可调用,但这种使用方法有点类似硬编码,会带来许多问题。
但为了保证全局唯一,除了使用单例,我们还可以用静态方法来实现,这也是项目开发中经常用到的一种实现思路。
如何设计试下一个集群环境下的分布式单例模式
–占坑–