Java一分钟之-设计模式:单例模式的实现

本文涉及的产品
Serverless 应用引擎 SAE,800核*时 1600GiB*时
注册配置 MSE Nacos/ZooKeeper,118元/月
函数计算FC,每月15万CU 3个月
简介: 【5月更文挑战第16天】本文介绍了单例模式的四种实现方式:饿汉式(静态初始化)、懒汉式(双检锁)、静态内部类和枚举单例,以及相关问题和解决方法。关注线程安全、反射攻击、序列化、生命周期和测试性,选择合适的实现方式以确保代码质量。了解单例模式的优缺点,谨慎使用,提升设计效率。

单例模式是一种常见的设计模式,用于确保一个类只有一个实例,并提供全局访问点。本文将介绍单例模式的几种实现方式,以及相关的常见问题、易错点和如何避免它们。
image.png

1. 饿汉式(Static Singleton)

在类加载时就创建实例,线程安全,但可能导致不必要的资源浪费。

public class Singleton {
   
   
    private static final Singleton INSTANCE = new Singleton();

    private Singleton() {
   
   }

    public static Singleton getInstance() {
   
   
        return INSTANCE;
    }
}

2. 懒汉式(DCL,Double-Checked Locking)

延迟初始化,只有在首次使用时才创建实例。使用volatile关键字保证可见性和有序性。

public class Singleton {
   
   
    private volatile static Singleton INSTANCE;

    private Singleton() {
   
   }

    public static Singleton getInstance() {
   
   
        if (INSTANCE == null) {
   
   
            synchronized (Singleton.class) {
   
   
                if (INSTANCE == null) {
   
   
                    INSTANCE = new Singleton();
                }
            }
        }
        return INSTANCE;
    }
}

3. 静态内部类(Thread-safe Lazy Initialization)

利用类加载机制保证线程安全,延迟初始化。

public class Singleton {
   
   
    private Singleton() {
   
   }

    private static class SingletonHolder {
   
   
        private static final Singleton INSTANCE = new Singleton();
    }

    public static Singleton getInstance() {
   
   
        return SingletonHolder.INSTANCE;
    }
}

4. 枚举单例

最简洁、安全的实现方式,天然线程安全,防止反射攻击。

public enum Singleton {
   
   
    INSTANCE;
}

5. 常见问题与解决

5.1 反射攻击

通过反射创建新的实例,绕过单例约束。枚举单例可以防止这种情况。

Singleton singleton = Singleton.class.getDeclaredConstructor().newInstance();

5.2 序列化与反序列化

单例对象被序列化和反序列化时,可能会创建多个实例。在单例类上实现readResolve()方法来返回已存在的实例。

private Object readResolve() {
   
   
    return INSTANCE;
}

5.3 单例的生命周期

单例的生命周期与应用相同,如果需要在特定条件下销毁,需要额外处理。

6. 易错点与避免方法

6.1 避免在静态初始化器中创建实例

静态初始化器在类加载时执行,可能导致不必要的实例化。

6.2 注意线程安全

在多线程环境中,确保单例的创建是线程安全的。

6.3 考虑可测试性

设计单例时,考虑测试需求,如提供构造函数的友元访问。

7. 结语

单例模式在许多场景下都非常有用,但使用时需谨慎,避免滥用。理解各种实现方式及其优缺点,根据项目需求选择合适的方法。同时,注意单例的生命周期、线程安全和测试性,以确保代码的质量和可维护性。


掌握单例模式的实现方式,有助于你在实际项目中更好地组织代码和管理资源。不断学习和实践,将使你的设计更加优雅和高效。

目录
相关文章
|
8天前
|
设计模式 存储 安全
PHP中的设计模式:单例模式深度解析
在软件开发的广袤天地中,设计模式如同璀璨星辰,指引着程序员们解决复杂问题的方向。其中,单例模式以其独特的魅力,确保了一个类仅有一个实例,并提供了一个访问它的全局访问点,成为众多项目中不可或缺的设计智慧。本文旨在深入探讨PHP中单例模式的实现方式、应用场景及背后的哲理,引导读者思考其在现代软件架构中的重要性与运用策略。
23 5
|
9天前
|
设计模式 存储 缓存
PHP中的设计模式:单例模式的深入解析
在PHP开发中,设计模式是提高代码可维护性、扩展性和重用性的关键技术之一。本文将深入探讨PHP中的单例模式,包括其定义、实现方式、应用场景以及优缺点。通过对单例模式的全面剖析,帮助开发者更好地理解和应用这一设计模式,从而编写出更加高效和优雅的PHP代码。
|
9天前
|
存储 设计模式 安全
Java设计模式-备忘录模式(23)
Java设计模式-备忘录模式(23)
|
9天前
|
设计模式 存储 算法
Java设计模式-命令模式(16)
Java设计模式-命令模式(16)
|
9天前
|
设计模式 Java
Java设计模式-装饰器模式(10)
Java设计模式-装饰器模式(10)
|
9天前
|
设计模式 Java 程序员
Java设计模式-适配器模式(8)
Java设计模式-适配器模式(8)
|
9天前
|
设计模式 安全 Java
设计模式--单例模式Singleton
这篇文章详细介绍了单例模式Singleton的八种实现方式,包括饿汉式(静态常量和静态代码块)、懒汉式(线程不安全和线程安全的同步方法、同步代码块)、双重检查、静态内部类和枚举。每种方式都有详细的代码示例和优缺点说明,帮助理解单例模式的应用和选择适合的实现方法。
设计模式--单例模式Singleton
|
9天前
|
设计模式 存储 缓存
Java设计模式 - 解释器模式(24)
Java设计模式 - 解释器模式(24)
|
9天前
|
设计模式 安全 Java
Java设计模式-迭代器模式(21)
Java设计模式-迭代器模式(21)
|
10天前
|
设计模式 缓存 监控
Java设计模式-责任链模式(17)
Java设计模式-责任链模式(17)
下一篇
无影云桌面