单例模式 (singleton): 是 JAVA 中最简单的一种设计模式, 属于创建型模式. 所谓单例, 就是整个程序有且仅有一个实例.
特点:
构造方法私有化
在本类中实例化一个对象作为本类的属性
对外提供一个访问本类对象的方法
饿汉式: 类加载时就加载对象
应用场景: 小对象, 频繁用, 高并发
特点: 线程安全, 比较常用, 但容易产生垃圾, 影响性能, 因为一开始就初始化.
- class Singleton{
- // 构造方法私有化
- private Singleton() {
- System.out.println("构造方法");
- }
- // 对象在类加载时初始化
- private static final Singleton instance = new Singleton();
- // 提供对外的访问方法
- public static Singleton getInstance() {
- return instance;
- }
- }
懒汉式: 对象何时需要何时创建, 线程不安全
应用场景: 单线程, 大对象
特点: 线程不安全, 延迟初始化.
- class Singleton{
- private Singleton() {
- System.out.println("构造方法");
- }
- private static Singleton instance;
- public static Singleton getInstance() {
- if (instance == null) {
- instance = new Singleton();
- }
- return instance;
- }
- }
同步锁机制
应用场景: 多线程, 大对象, 稀少用.
特点: 通过加锁保证了线程安全, 性能会下降.
- class Singleton{
- private Singleton() {
- System.out.println("构造方法");
- }
- private static Singleton instance;
- // 同步方法, 线程安全, 但性能会下降
- public static synchronized Singleton getInstance() {
- if (instance == null) {
- instance = new Singleton();
- }
- return instance;
- }
- }
双重验证机制
应用场景: 大对象, 稀少用, 并发量不能太大
特点: 线程安全, 延迟初始化.
- class Singleton{
- private Singleton() {
- System.out.println("构造方法");
- }
- private static volatile Singleton instance;
- // 同步方法, 双重验证, 减少阻塞次数, 提高性能
- public static Singleton getInstance() {
- if (instance == null) {
- synchronized (Singleton.class) {
- if (instance == null) {
- instance = new Singleton();
- }
- }
- }
- return instance;
- }
- }
静态内部类
引用场景: 大对象, 频繁用, 高并发
特点: 延时对象创建, 减少资源占用, 提高系统性能
- class Singleton{
- private Singleton() {
- System.out.println("构造方法");
- }
- static class Inner{
- private static final Singleton instance = new Singleton();
- }
- public static Singleton getInstance() {
- return Inner.instance;
- }
- }
枚举
- enum Singleton{
- // 类加载时创建
- INSTANCE;
- }
由于单例模式是创建型模式, 每次调用都会新建一个实例. 那么一个重要的问题就是反序列化. 当实例被写入到文件到反序列化成实例时, 我们需要重写 readResolve 方法, 以让实例唯一.
- private Object readResolve() throws ObjectStreamException{
- return singleton;
- }
来源: https://www.cnblogs.com/shi-zhe/p/11609650.html