23种经典设计模式之单例模式

本文深入探讨了Java中的单例设计模式,解释了为何使用单例以确保对象唯一性,并详细介绍了五种不同的单例实现方式:饿汉式、懒汉式、双重检查、静态内部类以及枚举实现。每种方式都有其优缺点,如饿汉式的简洁但非线程安全,懒汉式的线程安全但性能损失,以及双重检查和静态内部类的线程安全与懒加载兼顾,最后是枚举的简洁与线程安全特性。这些实现方式提供了在不同场景下选择合适单例模式的参考。
摘要由CSDN通过智能技术生成

单例模式

为什么要使用单例?

单例设计模式:一个类只允许创建一个对象(或者实例)

对象实例需求为唯一性

如何实现一个单例?

实现单例需要关注点:

  1. 构造函数私有化,这样才能防止外部通过new进行实例化
  2. 考虑对象创建时的线程安全问题
  3. 考虑是否支持延迟加载
  4. 考虑 getInstance() 性能是否高(是否加锁)

实现方式

1. 饿汉式

public class Singleton {
    private static final Singleton instance = new Singleton();
    
    // 构造函数私有化
    private Singleton() {
        
    }
    
    
    public static Singleton getInstance() {
        return instance;
    }
}

优点:实现简单

缺点:非线程安全

2. 懒汉式

public class Singleton {
    private static final Singleton instance;
    
    // 构造函数私有化
    private Singleton() {
        
    }
    
    public synchronized static Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}

优点:保证了线程安全

缺点:加锁导致并发度不高,性能有损失

3. 双重检测

public class Singleton {
    // 防止指令重排
    private static volatile Singleton instance;
    
    private Singleton() {
        
    }
    
    public static Singleton getInstance() {
        if (instance == null) {
            synchronized(Singleton.class) {
                if (instance == null) {
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}

既保证了线程安全,又支持懒加载

4. 静态内部类

public class Singleton { 
  private Singleton() {}

  private static class SingletonHolder{
    private static final Singleton instance = new Singleton();
  }
  
  public static Singleton getInstance() {
    return SingletonHolder.instance;
  }
}

既保证线程安全,又支持懒加载

5. 枚举

public enum Singleton {
  INSTANCE;
}

通过Java枚举类型的本身特性来保证了实例创建的线程安全和实例的唯一性

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值