前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【地铁上的设计模式】--创建型模式:单例模式(三)--双重检验锁单例

【地铁上的设计模式】--创建型模式:单例模式(三)--双重检验锁单例

作者头像
喵叔
发布2023-04-28 19:58:00
2390
发布2023-04-28 19:58:00
举报
文章被收录于专栏:喵叔's 专栏
什么是双重检验锁单例

双重检验锁单例模式实现了懒汉式单例模式的延迟加载和饿汉式单例模式的线程安全。其主要思路是在获取单例实例时,先检查是否已经实例化,如果没有才进行同步块。在同步块内部再进行一次实例化检查,以确保只有一个实例被创建。这样,就能够在保证单例实例唯一性的同时,减少了多线程环境下的性能开销。

如何实现双重检验锁单例

双重检验锁单例模式的实现步骤如下:

  1. 将构造函数设为私有,防止外部直接实例化该类;
  2. 声明一个静态的私有变量来保存类的唯一实例;
  3. 提供一个公有的静态方法获取类的唯一实例,在方法内部进行双重检验锁,即先判断实例是否已经创建,如果没有再进行同步块,在同步块内部再次检验实例是否已经被创建,如果没有则进行实例化。

Java实现

代码语言:javascript
复制
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;
    }
}

在示例中,我们使用了volatile关键字来保证线程间的可见性,同时在同步块内部进行双重检验锁,保证只有一个实例被创建。 C#实现

代码语言:javascript
复制
public sealed class Singleton
{
    private static volatile Singleton instance;
    private static object syncRoot = new Object();

    private Singleton() {}

    public static Singleton Instance
    {
        get 
        {
            if (instance == null) 
            {
                lock (syncRoot) 
                {
                    if (instance == null) 
                    {
                        instance = new Singleton();
                    }
                }
            }
            return instance;
        }
    }
}

在这个示例中,我们同样使用了volatile关键字来保证线程间的可见性,并在同步块内部进行双重检验锁,保证只有一个实例被创建。由于C#语言的特性,我们使用了lock关键字来进行同步,而不是synchronized关键字。

总结

双重检验锁单例模式能够确保只有一个实例被创建,并具有较好的性能表现和延迟创建的能力。其优点是在多线程环境下可以保证线程安全,并且可以延迟对象的创建,节省了系统资源。缺点是在某些情况下可能会出现线程安全问题,例如在JDK1.4之前的版本中使用双重检验锁时可能会因为指令重排而导致多线程下出现创建多个实例的问题。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-04-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 什么是双重检验锁单例
  • 如何实现双重检验锁单例
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档