【JAVA】Java 中什么叫单例设计模式?请用 Java 写出线程安全的单例模式

🍎个人博客:个人主页

🏆个人专栏:JAVA

⛳️ 功不唐捐,玉汝于成


目录

前言

正文

[懒汉式(Lazy Initialization):](#懒汉式(Lazy Initialization):)

[双重检查锁定(Double-Checked Locking):](#双重检查锁定(Double-Checked Locking):)

结语

我的其他博客


前言

在软件设计中,单例设计模式是一种重要的设计思想,它确保了一个类只有一个实例,并提供了一个全局访问点。在多线程环境下,实现线程安全的单例模式是必要的,以确保在并发操作中不会破坏单例的规则。

正文

单例设计模式是一种创建型设计模式,其主要目的是确保一个类只有一个实例,并提供一个全局访问点。

在Java中实现线程安全的单例模式有多种方式,其中两种常见的方式是懒汉式和饿汉式。

懒汉式(Lazy Initialization):

在懒汉式中,实例的创建是在第一次使用时进行的,以延迟初始化。

复制代码
   public class LazySingleton {
       private static LazySingleton instance;

       private LazySingleton() {
           // 私有构造方法,防止外部直接实例化
       }

       public static synchronized LazySingleton getInstance() {
           if (instance == null) {
               instance = new LazySingleton();
           }
           return instance;
       }
   }

上述代码中,getInstance 方法使用了 synchronized 关键字,确保了多线程环境下的线程安全。但是,这样的实现会导致性能问题,因为每次调用 getInstance 时都要进行同步。

双重检查锁定(Double-Checked Locking):

双重检查锁定是在懒汉式的基础上进行改进,通过双重检查减小了同步块的范围,提高了性能。

复制代码
public class DoubleCheckedLockingSingleton {
    private static volatile DoubleCheckedLockingSingleton instance;

    private DoubleCheckedLockingSingleton() {
        // 私有构造方法,防止外部直接实例化
    }

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

在上述代码中,使用了 volatile 关键字来保证 instance 的可见性,并且使用了双重检查来确保只在第一次调用 getInstance 时才进行同步。

这两种方式都是线程安全的单例模式实现,开发者可以根据具体的需求选择适合自己项目的方式。近年来,也推荐使用静态内部类方式实现单例,以及利用枚举类型实现单例,它们都是更为简洁和安全的实现方式。

结语

在Java中,线程安全的单例模式有多种实现方式,懒汉式和双重检查锁定是其中的两种常见方式。选择适合自己项目的方式时,需要考虑性能、延迟初始化、代码简洁性等因素。近年来,也出现了更为简洁和安全的实现方式,如使用静态内部类或者枚举类型。无论选择哪种方式,理解单例模式的设计原理对于编写健壮、高效的代码至关重要。希望通过学习单例模式,你能够更好地应用它,提高代码的可维护性和性能。

我的其他博客

【JAVA】线程的run()和start()有什么区别?-CSDN博客

【日常聊聊】程序员必备的面试技巧:如何在面试战场上脱颖而出-CSDN博客

【JAVA】Java8开始ConcurrentHashMap,为什么舍弃分段锁-CSDN博客

【JAVA】怎么确保一个集合不能被修改-CSDN博客

【Web开发】会话管理与无 Cookie 环境下的实现策略-CSDN博客

【Mybatis】Mybatis如何防止sql注入-CSDN博客

【软件工程】航行敏捷之路:深度解析Scrum框架的精髓-CSDN博客

【Spring】理解IoC与AOP:构建灵活而模块化的软件架构-CSDN博客

相关推荐
喜欢吃燃面几秒前
C++算法竞赛:位运算
开发语言·c++·学习·算法
草莓熊Lotso3 分钟前
《详解 C++ Date 类的设计与实现:从运算符重载到功能测试》
开发语言·c++·经验分享·笔记·其他
水痕014 分钟前
gin结合minio来做文件存储
java·eureka·gin
谱写秋天10 分钟前
Qt 5.5 的安装与配置(使用 VSCode编辑)
开发语言·vscode·qt
项目申报小狂人11 分钟前
算法应用上新!自适应更新策略差分进化算法求解球形多飞行器路径规划问题,附完整MATLAB代码
开发语言·算法·matlab
寒士obj13 分钟前
Spring事物
java·spring
柯南二号1 小时前
【Java后端】Spring Boot 集成 MyBatis-Plus 全攻略
java·spring boot·mybatis
阿珊和她的猫4 小时前
v-scale-scree: 根据屏幕尺寸缩放内容
开发语言·前端·javascript
_Kayo_6 小时前
node.js 学习笔记3 HTTP
笔记·学习