面时莫慌 | 设计模式 | 挑战单例模式(一)

本文详细探讨了Java单例模式的各种实现方式,包括饿汉式、懒汉式、双重检查锁、静态内部类、注册式(Enum)和ThreadLocal。对比分析它们的优缺点,适合开发者理解和选择适用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

说起单例模式,这个是GOF 23中经典设计模式中的经典。大多数开发人员都能实现两三种,这篇文章来分析所有的实现方式,以及各个的优缺点。

一、概念

单例模式是 Java 中最简单的设计模式之一。 这种类型的设计模式属于创建模式,因为这种模式提供了创建对象的最佳方法之一。

这种模式涉及一个单一的类,它负责创建一个对象,同时确保只创建一个对象。 此类提供了一种访问其唯一可以直接访问的对象的方法,而无需实例化该类的对象。

单例模式在实际开发中应用十分广泛,比如在J2EE标准中,ServletContextServletContextConfig等;还有在我们使用的Spring框架中ApplicationContext;也还有我们用到一个数据库连接框架的连接池都是单例的形式。

单例的实现方式多种多样,最主要包括:

  • 饿汉式

  • 懒汉式

  • 双重检查锁式

  • 静态内部类

  • 注册式(Enum实现)

  • ThreadLocal线程式

二、 饿汉式

饿汉式单例就是在类加载的时候立即初始化,并且创建单例对象。绝对线程安全,在线程还有出现以前就是实例化了,不可能存在访问安全问题。

实现方式如下:

public class SingletonInHungry {
    private static final SingletonInHungry INSTANCE = new SingletonInHungry();
    
    private SingletonInHungry(){
    }
    
    public static SingletonInHungry getInstance(){
        return INSTANCE;
    }
}

我们可以从代码实现上看出,饿汉式单例的优点包括没有加任何的锁、执行效率比较高。缺点也是相当明显,类加载的就初始化完成,不管你用还是不用,都站着空间,浪费了内存,很有可能长期不会使用,占着茅坑不拉屎。

另外,饿汉式还有另一种实现方式,如下所示,这种实现方式是利用静态代码块的机制。

public class SingletonInAnotherHungry {
    
    private static final SingletonInAnotherHungry INSTANCE;
​
    static {
        INSTANCE = new SingletonInAnotherHungry();
    }
    
    private SingletonInAnotherHungry(){}
    
    public static SingletonInAnotherHungry getInstance(){
        return INSTANCE;
    }
}

这两种实现方式都可,易于理解,饿汉式适用于单例对象较少的情况。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值