`
softstone
  • 浏览: 480780 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

singleton模式的一种变体:double-checked locking

阅读更多
singleton模式的一种变体:double-checked locking

在单线程下,我们的singleton多半是这样(java):
class Singleton{
  private Singleton(){ //... };
  private static Singleton instance = null;
  public static Singleton getInstance
  {
    if ( instance == null )
      instance = new Singleton();
    return instance;
  };
  //...
  }

但是在多线程环境下,这里有个问题:如果一个线程先检查了instance==null,然后开始创建新的实例;同时另一个线程又来检查instance==null(此时第一个线程的创建还没完成),然后也创建新的实例。这样就有了Singleton类的两个实例——我们的singleton模式失败了。

所以我们应该加入同步代码。但是加在哪里呢?如果每个线程都需要同步再获得实例引用,这必然会形成一个瓶颈;如果在instance==null的检查后面加同步代码……这根本没有用。为什么?自己想想吧。

我们应该怎么办?同步代码肯定应该在instance==null的后面,同时,在创建新对象之前应该再检查一次instance==null:
class Singleton{
  //...
  private synchronized static void doSync(){
    //在这里同步
  }
  public Singleton getInstance(){
    if(instance==null){
      Singleton.doSync();
      if(instance==null)  // 再进行一次检查
        instance = new Singleton();
    }
    return instance;
  }

两次检查,既避免了效率瓶颈,又避免了重复创建。这就是double-checked locking模式。
分享到:
评论

相关推荐

    C++ and the Perils of Double Checked Locking.zip

    《C++ and the Perils of Double Checked Locking》是一篇探讨C++编程中双重检查锁定(Double-Checked Locking)模式潜在问题的文献。在多线程编程中,双重检查锁定是一种常见的优化策略,旨在减少对同步原语的依赖...

    DataSource的单态模式(SingleTon)程序---马克-to-win java视频

    DataSource的单态模式(SingleTon)程序---马克-to-win java视频 数据源 单态模式 dataSource Singleton

    C++完美实现Singleton模式

    为了解决这一问题,可以采用双重检查锁定(Double-Checked Locking)模式来确保线程安全性: ```cpp class Singleton { public: static Singleton* Instance() { if (_instance == nullptr) { lock_guard<mutex>...

    Python库 | django-singleton-admin-0.0.2.macosx-10.7-intel.exe

    python库。 资源全名:django-singleton-admin-0.0.2.macosx-10.7-intel.exe

    设计模式复习题.doc

    - 使用观察者模式来定义对象之间的一对多关系 - 使用适配器模式来封装对象并提供不同的接口 4. 设计模式的设计原则: - 开闭原则:扩展开放,修改关闭 - 里式代换原则 - 合成聚合原则 - 依赖倒转原则 - ...

    Singleton模式源程序

    2. 双重检查锁定(Double-Checked Locking):这是最常见的一种线程安全实现方式。在获取实例时先检查实例是否已经存在,若不存在再加锁并创建。这样可以减少不必要的同步开销。 3. 原子操作:利用C++11引入的std::...

    Singleton模式

    Singleton模式是一种常用的软件设计模式,它保证一个类只有一个实例,并提供一个全局访问点。这个模式在许多场景下非常有用,比如配置管理、日志服务、线程池等,需要确保全系统内只有一个对象来处理特定任务的情况...

    C++ 实现的singleton 模式

    Singleton模式是一种常用的软件设计模式,它保证一个类只有一个实例,并提供一个全局访问点。这种模式在很多场景下都非常有用,例如管理共享资源,如数据库连接池,或者确保某个对象在整个系统中的唯一性。下面我们...

    设计模式C++学习之单例模式(Singleton)

    单例模式是软件设计模式中的一种,它保证一个类只有一个实例,并提供一个全局访问点。在C++中,实现单例模式有多种方法,我们将会深入探讨这一模式的原理、优缺点以及如何在实际编程中应用。 单例模式的核心在于...

    java设计模式PPT

    在Java中,通常使用双重检查锁定(Double-Checked Locking)或静态内部类来实现线程安全的单例。 3. **工厂模式**: - 提供一个接口用于创建对象,但让子类决定实例化哪一个类。这将类的实例化延迟到子类,使得...

    C++CLI中实现singleton模式

    双重检测锁(Double-Checked Locking)实现的Singleton模式在多线程应用中有相当的价值。在ACE的实现中就大量使用ACE_Singleton模板类将普通类转换成具有Singleton行为的类。这种方式很好地消除了一些重复代码臭味,...

    Java的Singleton模式代码(免资源分)

    #### 三、双重检查锁定(Double-Checked Locking) **代码示例:** ```java public class Singleton { private volatile static Singleton instance; private Singleton() {} public static Singleton ...

    C#面向对象设计模式纵横谈(2):Singleton 单件(创建型模式)

    "Singleton"模式是其中一种创建型设计模式,它确保一个类只有一个实例,并提供一个全局访问点来获取这个唯一的实例。本篇文章将深入探讨C#中的Singleton模式,包括其原理、实现方式以及适用场景。 首先,Singleton...

    设计模式一点通之单态模式 C++

    单态模式(Singleton Pattern)是软件设计模式中的一种,它保证一个类只有一个实例,并提供一个全局访问点。这种模式在需要频繁创建和销毁对象,且只允许存在一个实例的情况下非常有用,例如配置管理、线程池、缓存...

    singleton单例模式

    2. **双重检查锁定(Double-Checked Locking)**:这种方法是在多线程环境下保证线程安全的单例。首先检查是否已经实例化,如果未实例化,则同步锁定构造函数,确保只有一个线程可以进入,然后创建实例。这种方式...

    C#面向对象设计模式纵横谈-1.Singleton 单件(创建型模式)

    Singleton模式的实现有多种变体,例如懒汉式(Lazy Initialization)、饿汉式(Eager Initialization)和双检锁/双重检查锁定(Double-Check Locking)。懒汉式是在第一次使用时才创建实例,而饿汉式则是在类加载时...

    单例模式中声明静态自己类型的指针编译显示未定义处理

    2. **使用双检锁(Double-Checked Locking)**:为了在多线程环境下保证线程安全,可以采用双检锁机制。这避免了每次调用`getInstance()`时都需要加锁,提高了效率。不过,需要注意的是,这种方法在某些旧版本的C++...

    Java常用设计模式(SingleTon、FactoryMethod、AbstractFactory)

    这里我们将深入探讨三种常见的Java设计模式:单例(Singleton)、工厂方法(Factory Method)和抽象工厂(Abstract Factory)。 **单例模式(Singleton)** 单例模式确保一个类只有一个实例,并提供一个全局访问点...

    设计之模式之单例(Singleton)

    在软件设计模式中,单例(Singleton)是一种广泛使用的模式,它确保一个类只有一个实例,并提供全局访问点。这个模式通常用于控制共享资源的访问,比如数据库连接、线程池或者配置对象。以下是对单例模式的详细阐述...

Global site tag (gtag.js) - Google Analytics