如何实现一个线程安全的单例模式?

饿汉式

实现思路:在类加载时就创建单例实例,由于类加载由 JVM 保证线程安全,所以天生线程安全。

代码示例(Java):

csharp 复制代码
public class Singleton {
    private static final Singleton instance = new Singleton();
    private Singleton() {}
    public static Singleton getInstance() {
        return instance;
    }
}

懒汉式(双重检查锁)

实现思路:只有在第一次调用 getInstance 方法时才创建实例。通过双重检查锁机制,先检查实例是否已存在,若不存在再进行同步操作创建实例,避免了不必要的同步开销。双重检查锁+volatile 解决线程安全问题(防止指令重排的半初始化对象)

代码示例(Java):

csharp 复制代码
public class Singleton {
    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;
    }
}

volatile 关键字在此处很关键,它禁止指令重排序,保证在多线程环境下 instance 的创建过程按预期执行,避免其他线程拿到未初始化完全的实例。

静态内部类方式

实现思路:利用类的加载机制,将单例实例的创建放在静态内部类中。当外部类被加载时,静态内部类不会被加载,只有当调用 getInstance 方法时,静态内部类才会被加载,此时创建单例实例,由于类加载的线程安全性,实现了线程安全的单例

代码示例(Java):

csharp 复制代码
public class Singleton {       
    //静态内部类方式
    private Singeton() {
    }

    private static class singletonHolder {
        static final Singeton instance = new Singeton();
    }

    public static Singeton getInstance() {
        return singletonHolder.instance;
    }
}
相关推荐
折七9 分钟前
告别传统开发痛点:AI 驱动的现代化企业级模板 Clhoria
前端·后端·node.js
白衣鸽子13 分钟前
PageHelper:基于拦截器实现的SQL分页查询工具
后端·开源
璨sou14 分钟前
IDE集成开发工具-IDEA
后端
程序员小假15 分钟前
我们来说一说动态代理
java·后端
成成成成成成果42 分钟前
软件测试面试八股文:测试技术 10 大核心考点(二)
python·功能测试·测试工具·面试·职场和发展·安全性测试
武子康1 小时前
大数据-108 Flink 流批一体化入门:概念解析与WordCount代码实践 批数据+流数据
大数据·后端·flink
秦禹辰2 小时前
开源多场景问答社区论坛Apache Answer本地部署并发布至公网使用
开发语言·后端·golang
追逐时光者2 小时前
一款开源免费、组件丰富的 WPF UI 控件库,提供了 100 多款常用控件!
后端·.net
小旺不正经2 小时前
数据库表实现账号池管理
数据库·后端·算法
Penge6662 小时前
结构体内存计算:从字段到中文字符深挖
后端