Java中如何实现线程安全的单例模式?

目录

1、懒汉式(线程安全)

2、饿汉式(线程安全)

3、双重校验锁(线程安全)

4、静态内部类(推荐)

5、枚举(最佳方法)

6、总结


在Java中,实现线程安全的单例模式通常有以下几种方式:

1 、懒汉式(线程安全)

使用synchronized关键字同步获取实例的方法,确保只有一个线程可以执行该方法,实现线程安全。但这种方式效率较低。

java 复制代码
public class Singleton {
    private static Singleton instance;

    private Singleton() {}

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

2 、饿汉式(线程安全)

实例在类加载时就创建,由于类加载机制保证了线程安全,这种方式简单但可能会导致资源浪费。

java 复制代码
public class Singleton {
    private static Singleton instance = new Singleton();

    private Singleton() {}

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

3 、双重校验锁(线程安全)

使用volatile关键字确保多线程环境下的可见性,避免指令重排序导致的问题。双重检查锁定机制在第一次检查实例是否为null时不加锁,只有在实例为null的情况下才进行同步,从而提高性能。

java 复制代码
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;
    }}

4 、静态内部类(推荐)

利用静态内部类来持有单例实例,该类只会被加载一次,因此确保了实例的唯一性。这种方式结合了懒汉式的延迟加载和线程安全性,是推荐使用的方式之一。

java 复制代码
public class Singleton {
    private Singleton() {}

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

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

5 、枚举(最佳方法)

使用枚举来实现单例模式是最简单也是最安全的方式。枚举类型天然支持序列化机制,并且由JVM保证线程安全。

java 复制代码
public enum Singleton {
    INSTANCE;

    public void someMethod() {
        // 实现方法
    }
}

6、总结

在实际应用中,可以根据项目需求和性能要求选择合适的实现方式。通常情况下,使用静态内部类或枚举是较为推荐的做法,它们既简洁又线程安全。

相关推荐
Q_Q5110082852 小时前
python的软件工程与项目管理课程组学习系统
spring boot·python·django·flask·node.js·php·软件工程
2301_793086872 小时前
SpringCloud 02 服务治理 Nacos
java·spring boot·spring cloud
MacroZheng4 小时前
还在用WebSocket实现即时通讯?试试MQTT吧,真香!
java·spring boot·后端
midsummer_woo4 小时前
基于springboot的IT技术交流和分享平台的设计与实现(源码+论文)
java·spring boot·后端
别惹CC5 小时前
Spring AI 进阶之路01:三步将 AI 整合进 Spring Boot
人工智能·spring boot·spring
柯南二号7 小时前
【Java后端】Spring Boot 集成 MyBatis-Plus 全攻略
java·spring boot·mybatis
javachen__8 小时前
SpringBoot整合P6Spy实现全链路SQL监控
spring boot·后端·sql
IT毕设实战小研14 小时前
基于Spring Boot 4s店车辆管理系统 租车管理系统 停车位管理系统 智慧车辆管理系统
java·开发语言·spring boot·后端·spring·毕业设计·课程设计
一只爱撸猫的程序猿15 小时前
使用Spring AI配合MCP(Model Context Protocol)构建一个"智能代码审查助手"
spring boot·aigc·ai编程
甄超锋15 小时前
Java ArrayList的介绍及用法
java·windows·spring boot·python·spring·spring cloud·tomcat