【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博客

相关推荐
weixin_461259416 分钟前
[C]C语言日志系统宏技巧解析
java·服务器·c语言
cacyiol_Z9 分钟前
在SpringBoot中使用AWS SDK实现邮箱验证码服务
java·spring boot·spring
竹言笙熙21 分钟前
Polarctf2025夏季赛 web java ez_check
java·学习·web安全
写bug写bug35 分钟前
手把手教你使用JConsole
java·后端·程序员
异常君36 分钟前
Java 中 try-catch 的性能真相:全面分析与最佳实践
java·面试·代码规范
程序员清风1 小时前
阿里二面:Kafka 消费者消费消息慢(10 多分钟),会对 Kafka 有什么影响?
java·后端·面试
幼稚园的山代王1 小时前
Prompt Enginering(提示工程)先进技术
java·人工智能·ai·chatgpt·langchain·prompt
周某某~2 小时前
二.单例模式‌
java·单例模式·设计模式
摸鱼仙人~2 小时前
深入理解Java单例模式:确保类只有一个实例
java·javascript·单例模式
SteveDraw2 小时前
C++动态链接库封装,供C#/C++ 等编程语言使用——C++动态链接库概述(总)
开发语言·c++·c#·封装·动态链接库