双检索单例模式

复制代码
双重检查锁定(Double-Checked Locking)是一种用于创建单例模式的技术,其目的是在保证线程安全的同时,尽可能地减少锁的竞争,提高性能。在 Java 中,双重检查锁定常常与懒汉式单例模式结合使用。
  • 以下是双重检查锁定实现的懒汉式单例模式的示例代码:
java 复制代码
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;
    }
}
  • 在这个示例中,Singleton 类使用了双重检查锁定实现了懒汉式单例模式。关键点如下:

    1.instance 变量使用了 volatile 关键字修饰,确保多个线程之间的可见性,以避免线程间的数据不一致问题。

    2.在 getInstance() 方法中,首先进行了一次非同步的检查,以避免不必要的同步开销。如果 instance 不为 null,则直接返回已经创建的实例。

    3.如果第一次检查通过,即 instance 为 null,则进入同步块。在同步块内部,再次检查 instance 是否为 null,这是为了确保只有一个线程进入同步块后创建实例。

    4.如果第二次检查也通过,即确认 instance 为 null,则创建实例并赋值给 instance 变量。

    最后返回实例。

    5.通过双重检查锁定,可以保证在多线程环境下只有一个实例被创建,并且在第一次获取实例时进行了同步操作,之后的获取实例操作不会再进入同步块,提高了性能。

相关推荐
这个昵称不容易5 小时前
SpringBoot「衣依」服装销售平台:144个Java文件180个接口,从挑衣服到收货评价整条链路都在
java·springboot·毕设
计算机毕设定制辅导-无忧学长5 小时前
《基于微信小程序的居家医疗陪护预约系统设计与实现》
java·spring boot·微信小程序·uniapp·居家医疗陪护预约系统
张张123y6 小时前
DSH 插件调试避坑:client.js 设置面板、热重载与高频报错排查表
开发语言·javascript·人工智能·开源·ecmascript·后端开发·ai agent
文丑颜不良啊7 小时前
LeetCode2221~2240题目解析
java·leetcode
秋饼7 小时前
Computer Use Agent Java 落地实战:感知-行动循环、执行器与安全围栏生产级实现
java·ai·技术分享·后端开发
冻柠檬飞冰走茶8 小时前
字母移动游戏题解:贪心求最长可保留连续子串(附 C 实现)
c语言·开发语言·数据结构·算法·动态规划
文丑颜不良啊9 小时前
LeetCode2161~2180题目解析
java·leetcode
FRing039 小时前
vue2干货总结7(自定义指令、插槽、单页应用程序、路由的使用(VueRouter))
开发语言·前端·vue.js·vue2
雪落漂泊9 小时前
C++算法 二分查找篇(上)
开发语言·c++·算法
波力海苔夹心脆67510 小时前
C# WPF 资源字典详解:ResourceDictionary、MergedDictionaries 与自定义控件案例
开发语言·c#·wpf·入门教程·resource·资源字典