几种常用单例
单例大致分为即时加载单例和延时加载单例,以下介绍几种常用的单例
1.枚举类单例 — 即时加载单例
优点:
1.简洁
2.线程安全
3.天然支持序列化,但能防止多次实例化
即时加载单例最为推荐的为枚举单例
例外:如果你的单例类必须继承某个超类,这种模式不适用
2.静态共有域单例 — 即时加载单例
相比静态公有域单例,更加推荐静态工厂方法单例
3.静态工厂方法单例 — 即时加载单例
优点:
1.内部可以改变单例实现方式或者改变类是否是单例,都可以保持API不变
2.和静态公有域单例几乎一模一样外还增加了灵活性,相比静态公有域单例,更加推荐静态工厂方法单例
下面是几种推荐的常用的延时加载单例方式:
延时单例出于以下几种考虑
1.出于性能资源考虑,不希望初始化的时候就被加载,使用频率不高
2.有外部资源依赖,提前加载会导致数据不完成
4.静态内部类单例 — 延时加载单例
优点:
1.由于整个加载流程中没有任何加锁的地方,所以没有任何成本
2.线程安全
3.在JVM层做到初始化类时同步域的访问,一旦初始化完毕之后没有任何条件判断和同步操作了
静态内部类单例是延时加载的主要推荐模式
5.双重校验锁单例 — 延时加载单例
由于有性能损耗,更建议推荐使用静态内部类单例
暂无评论