单例模式

简介: 单例模式


使用场景:在容器中一个对象只存在一个实例。

目的:1.防止堆中内存过多。影响效率。

          2.无论怎么使用,都规定使用同一个对象

实例:获取序列号,任务管理器,计数器等

缺点没有接口,不能继承,与单一职责原则冲突,一个类应该只关心内部逻辑,而不关心外面怎么样来实例化。

代码:

1.饿汉式(线程安全,调用效率高,但是不能延时加载,会占用内存)

1. public class Singleton {  
2. private static Singleton instance = new Singleton();  
3. private Singleton (){}  
4. public static Singleton getInstance() {  
5. return instance;  
6.     }  
7. }

2.懒汉式(线程安全,调用效率不高,但是能延时加载)

1. public class Singleton {  
2. private static Singleton instance;  
3. private Singleton (){}  
4. public static synchronized Singleton getInstance() {  
5. if (instance == null) {  
6.         instance = new Singleton();  
7.     }  
8. return instance;  
9.     }  
10. }

3.双检锁/双重校验锁 延时加载 比较复杂 不建议使用

1. public class Singleton {  
2. private volatile static Singleton singleton;  
3. private Singleton (){}  
4. public static Singleton getSingleton() {  
5. if (singleton == null) {  
6.         synchronized (Singleton.class) {  
7. if (singleton == null) {  
8.             singleton = new Singleton();  
9.         }  
10.         }  
11.     }  
12. return singleton;  
13.     }  
14. }

4.静态内部类 延时加载 只适用于静态域的情况

1. public class Singleton {  
2. private static class SingletonHolder {  
3. private static final Singleton INSTANCE = new Singleton();  
4.     }  
5. private Singleton (){}  
6. public static final Singleton getInstance() {  
7. return SingletonHolder.INSTANCE;  
8.     }  
9. }
10.

5.枚举 非延时加载

1. public enum Singleton {  
2.     INSTANCE;  
3. public void whateverMethod() {  
4.     }  
5. }

一般情况下,建议使用饿汉模式,只有在要明确实现 lazy loading 效果时,才会使用第静态内部类方式。如果涉及到反序列化创建对象时,可以尝试使用枚举方式。如果有其他特殊的需求,可以考虑使用第 4 种双检锁方式。


相关文章
|
3月前
|
存储 设计模式 测试技术
单例模式
单例模式
|
6月前
|
C++
【C++ 单例模式】
【C++ 单例模式】
|
设计模式 Java Spring
什么场景要使用单例模式,什么场景不能使用?
经常有小伙伴问我,设计模式学了这么久,每次看到概念也都能理解。但是,就是不知道怎么用,在哪里能用?我告诉大家,设计模式,不是为了要用而用的,而是作为前人总结下来的经验,等到哪天需要用的时候,你能想起来为你所用。
104 0
|
设计模式 前端开发
关于单例模式我所知道的
关于单例模式我所知道的
59 0
关于单例模式我所知道的
|
安全 Java
原来要这么实现单例模式
原来要这么实现单例模式
56 0
找对象需要单例模式吗?
单例模式的类只提供私有的构造函数
|
设计模式 缓存 JSON
没那么简单的单例模式
没那么简单的单例模式
127 0
没那么简单的单例模式
|
存储 安全 调度
单例模式的简单介绍
单例模式的简单介绍
|
设计模式 缓存
我学会了,单例模式
单例模式属于创建型模式,这个类型的设计模式是将 对象的创建和使用解耦了,花式的去创建对象。
130 0
我学会了,单例模式
|
设计模式 数据库 Python