设计模式之单例模式
- 一、单例模式是什么?
- 使用场景
- 二、实现
- 懒汉式
- 饿汉式
- 双检锁/双重校验锁
- 总结
一、单例模式是什么?
这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。
注意:
- 单例类只能有一个实例。
- 单例类必须自己创建自己的唯一实例
- 单例类必须给所有其他对象提供这一实例
使用场景
- 要求生产唯一序列号
- WEB 中的计数器,不用每次刷新都在数据库里加一次,用单例先缓存起来
- 创建的一个对象需要消耗的资源过多,比如 I/O 与数据库的连接等
- 注意事项:getInstance() 方法中需要使用同步锁 synchronized (Singleton.class)
防止多线程同时进入造成 instance 被多次实例化
。
二、实现
懒汉式
public class Singleton { private static Singleton instance; private Singleton (){} public static synchronized Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; }
}
调用得时候才会加载,不会浪费内存
饿汉式
public class Singleton { private static Singleton instance = new Singleton(); private Singleton (){} public static Singleton getInstance() { return instance; }
}
类加载时就初始化,效率高,没有锁
双检锁/双重校验锁
public class Singleton { private volatile static Singleton singleton; private Singleton (){} public static Singleton getSingleton() { if (singleton == null) { synchronized (Singleton.class) { if (singleton == null) { singleton = new Singleton(); } } } return singleton; }
}
这种方式采用双锁机制,安全且在多线程情况下能保持高性能。
总结
一般情况下,不建议使用懒汉方式,建议使用饿汉方式。如果有其他特殊的需求,可以考虑使用双检锁方式。