当前位置: 首页 > article >正文

JAVA之单例模式

单例模式(Singleton Pattern)是一种设计模式,用于确保一个类只有一个实例,并提供一个全局访问点来获取该实例。在软件设计中,单例模式常用于控制对资源的访问,例如数据库连接、线程池等。以下是单例模式的详细介绍及JAVA代码实现。

一、单例模式的优点

  • 控制资源的使用,避免资源的多重占用。
  • 提供全局访问点,方便资源的管理。
  • 系统中只有一个实例,减少内存开销。
  • 避免对资源的多重占用,提高系统的性能。

二、单例模式的缺点

  • 单例模式可能会引起代码的不透明性。
  • 单例模式可能会导致代码的测试困难。
  • 单例模式可能会导致并发问题。

三、单例模式的实现方式 单例模式有多种实现方式,以下列举几种常见的实现方式:

  • 懒汉式(线程不安全)
  • 懒汉式(线程安全)
  • 饿汉式
  • 双重校验锁
  • 静态内部类
  • 枚举 以下分别对这几种实现方式进行详细说明及代码实现。
  • 懒汉式(线程不安全) 懒汉式单例模式在类加载时不初始化,在需要时才创建实例。缺点是线程不安全。
  1. JAVA代码实现:

public class Singleton {
    // 私有静态变量,用于存储单例实例
    private static Singleton instance;
    // 私有构造方法,防止外部直接创建实例
    private Singleton() {}
    // 公有静态方法,用于获取单例实例
    public static Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}
  1. 懒汉式(线程安全) 在懒汉式的基础上,通过同步方法保证线程安全。缺点是效率较低。 JAVA代码实现:

public class Singleton {
    private static Singleton instance;
    private Singleton() {}
    // 同步方法,保证线程安全
    public static synchronized Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}
  1. 饿汉式 饿汉式单例模式在类加载时就完成了初始化,保证了线程安全。缺点是类加载时就初始化,可能会浪费资源。 JAVA代码实现:

public class Singleton {
    // 私有静态变量,类加载时初始化
    private static Singleton instance = new Singleton();
    private Singleton() {}
    public static Singleton getInstance() {
        return instance;
    }
}
  1. 双重校验锁 双重校验锁单例模式在懒汉式的基础上,通过双重校验锁保证线程安全,同时提高效率。 JAVA代码实现:

public class Singleton {
    // 私有静态变量,使用volatile关键字保证多线程下的可见性和禁止指令重排序
    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;
    }
}
  1. 静态内部类 静态内部类单例模式利用静态内部类的特性,实现懒加载和线程安全。 JAVA代码实现:

public class Singleton {
    // 私有构造方法
    private Singleton() {}
    // 静态内部类,用于持有单例实例
    private static class SingletonHolder {
        private static final Singleton INSTANCE = new Singleton();
    }
    // 公有静态方法,获取单例实例
    public static final Singleton getInstance() {
        return SingletonHolder.INSTANCE;
    }
}
  1. 枚举 枚举单例模式利用枚举的特性,实现单例,且自动支持序列化机制,防止反射攻击。 JAVA代码实现:

public enum Singleton {
    // 枚举元素,本身就是单例
    INSTANCE;
    // 公有方法,可以添加其他业务方法
    public void doSomething() {
        // 业务逻辑
    }
}

四、总结

单例模式是一种简单且常用的设计模式,适用于需要确保一个类只有一个实例的场景。在实际开发中,应根据具体需求选择合适的实现方式。


http://www.kler.cn/a/503733.html

相关文章:

  • C#图表性能的巅峰之选:LightningChart®.NET
  • 数据存储与信息技术领域 - 磁带技术:企业用磁带与音乐磁带
  • 分多个AndroidManifest.xml来控制项目编译
  • [Deep Learning] Anaconda+CUDA+CuDNN+Pytorch(GPU)环境配置-2025
  • MATLAB学习笔记目录
  • 三 BH1750 光感驱动调试1
  • 【2024年华为OD机试】 (B卷,100分)- 矩形相交的面积(Java JS PythonC/C++)
  • 【MacOS】恢复打开系统设置的安全性的允许以下来源的应用程序的“任何来源”
  • 掌控 JMeter 测试节奏:Once Only Controller 让关键操作 “一步到位”
  • FPGA EDA软件的位流验证
  • 【深度学习】神经网络灾难性遗忘(Catastrophic Forgetting,CF)问题
  • 深入理解ASP.NET Core 管道的工作原理
  • Next.js如何用静态文件部署
  • 高并发性能优化随笔
  • 大疆上云API基于源码部署
  • 互联网全景消息(11)之Kafka深度剖析(下)
  • 为AI聊天工具添加一个知识系统 之38 一个基于ad hoc 临时传输实现的组织的动态社区平台
  • firefox PAC代理
  • 进阶——十六届蓝桥杯嵌入式熟练度练习(LCD显示屏)
  • 【2025最新】100%通过的计算机毕设新题目
  • Web 开发入门之旅:从静态页面到全栈应用的第一步
  • Golang概述
  • DeepSeek-V3技术报告
  • JavaSE面试
  • 搜广推校招面经七
  • 智能复合机器人:开启生产“智”造新时代