美文网首页
单例模式下的线程安全

单例模式下的线程安全

作者: fertilizer | 来源:发表于2017-08-08 23:13 被阅读0次

首先我们回顾一下,单例模式的概念:
单例模式:自我创建对象,唯一实例。
关键点:构造函数是私有的。

主要分为两种方式:lazy 和 hungry。
lazy方式主要是当生成该类实例时才调用,按需调用。(好像是有个专业术语:延迟初始化
hungry方式则是当类定义时就已经在静态存储区里生成该实例了

//case 1
class lazySingleton {
public:
    static lazySingleton* get_instance();
private:
    static lazySingleton* instance;
    lazySingleton();
};
lazySingleton::lazySingleton() = default;
lazySingleton* lazySingleton::instance = nullptr;
static lazySingleton* lazySingleton::get_instance() {
    if (instance == nullptr) {
        instance = new lazySingleton();
    }
    return instance;
}
//case 2
class hungrySingleton {
public:
    static hungrySingleton* get_instance();
private:
    static hungrySingleton* instance;
    hungrySingleton();
};
hungrySingleton::hungrySingleton() = default;
hungrySingleton* hungrySingleton::instance = new hungrySingleton();
static hungrySingleton* hungrySingleton::get_instance() {
    return instance;
}

case2很明显线程安全,case1则不是线程安全的。

case1改进的方法就是在get_instance()上加锁。但是立即加锁不作任何状态的检查很浪费资源,所以就有双重检测锁。大致代码如下:

static Singleton& Instance()  
{
    if (instance_ == NULL) 
    {
        Lock lock; //基于作用域的加锁,超出作用域,自动调用析构函数解锁
        if (instance_ == NULL)
        {
              instance_ = new Singleton;
        }
    }
    return *instance_;
}

除了以上三种,effective c++中的则是利用了local-static对象使得只有首次调用才会创建实例这一特性保证不会多次创建实例。
先总结这么多,下次补充具体实现代码。赶紧找食,超市要关门了~~~~

相关文章

  • 设计模式——单例模式的破坏

    概述: 之前学习了单例模式的几种实现,解决了多线程情况下,单例的线程安全问题,保证了单例的实现。但是单例模式在下面...

  • 设计模式

    手写单例模式(线程安全) 你知道几种设计模式?单例模式是什么?Spring中怎么实现单例模式?

  • 设计模式(2) 单例模式

    单例模式 线程安全的Singleton 会破坏Singleton的情况 线程级Singleton 单例模式是几个创...

  • 面试复习-设计模式

    一、单例模式 确保一个类只有一个实例,并提供一个全局访问点。 线程不安全的单例模式 懒汉式 线程安全的单例模式: ...

  • Java 常用单例

    一、线程不安全的单例模式 二、线程安全且高效的单例模式 1.双重校验锁 2.静态内部类

  • 设计模式——单例模式

    单例模式 饿汉模式 懒汉模式 线程不安全的模式 线程安全模式 懒汉模式和饿汉模式的区别

  • 1.5 单例模式

    不做赘述, 单例模式想必大家已经烂熟于心了. 这里提一下多线程如何保证的单例模式的线程安全. 外部的if判断不加锁...

  • 单例设计模式笔记

    记录几种单例模式写法。 饿汉模式(线程不安全) 懒汉模式(线程不安全) 懒汉锁模式(线程安全) 懒汉双重判断模式(...

  • 实现单例模式的方式2

    方式一: 能保证线程安全 定义类的时候实现单例模式 方式二: 能保证线程安全 对已定义好的类实现单例模式

  • iOS 三种单例创建方式的优缺点

    一、单线程模式单例 · 单线程单例只有在单个线程使用的情况下实用,在多线程的情况下,会产生线程不安全的情况。严格意...

网友评论

      本文标题:单例模式下的线程安全

      本文链接:https://www.haomeiwen.com/subject/cmexrxtx.html