美文网首页
懒汉单例模式 C++实现

懒汉单例模式 C++实现

作者: 假程序员 | 来源:发表于2019-03-08 01:06 被阅读0次
//
//  main.cpp
//  lazy_singleton_pattern
//
//  Created by apple on 2019/3/8.
//  Copyright © 2019年 apple. All rights reserved.
//

#include <iostream>

class Example
{
private:
    static Example *single;//静态变量
    Example();
public:
    static Example *GetSingleton();
    static void DestorySingle();
    void test();
};

Example *Example::single = NULL;//初始化静态变量为null
Example::Example(){};
Example *Example::GetSingleton()
{
    if (single == NULL) {//在if判断中,存在线程安全问题
        single = new Example();
    }
    return single;
}
void Example::DestorySingle()
{
    if (single != NULL)
    {
        delete single;
        single = NULL;
    }
}
void Example::test()
{
    std::cout<<this<<std::endl;
}

int main(int argc, const char * argv[]) {
    Example *a = Example::GetSingleton();
    a->test();
    Example::DestorySingle();
    Example *b = Example::GetSingleton();
    a->test();
    b->test();
    return 0;
}
0x100454ef0
0x100454ef0
0x100454ef0
Program ended with exit code: 0
    懒汉单例模式,什么是懒汉单例模式?懒汉单例模式不会迫切的需要单例对象,即在第一次需要该单例实例的时候才会生成该单例对象,之后再获取该单例实例时,该单例实例就是第一次获取时所生成的并返回的静态变量。
    根据单例模式特点,以一个静态方法返回一个静态变量,同时以懒汉为特点。我们可以这么做,在类加载的时候,将静态变量初始化为null。而根据懒汉的特点,我们需要在第一次调用静态方法时修改该静态变量的值,所以可以在静态方法中使用if语句判断该静态变量是否有值,若没有值,则给该静态变量重新赋值,再返回该静态变量。
    由上述创建过程会引发线程安全问题。假设同时有1000个线程在运行,并且该静态变量为null,此时这1000个线程同时调用静态方法,根据分时操作系统的特点,那么必然会存在部分线程在执行到if语句时,部分线程尚未执行到if语句,或部分线程已经执行过if语句,此时可能存在在执行对静态变量赋值操作的时候,该静态变量已由其他线程赋值,这样就导致了在同一时刻,创建了许多静态变量,并且许多静态变量都尚未使用就被抛弃了。这就是该懒汉单例模式的线程不安全性,
    针对线程不安全,本文不贴代码来解决线程不安全的问题,仅提供解决思路。既然是由同一时刻大量线程访问导致的线程不安全问题,那么我们可以让同一时刻只能有1个线程访问可能导致线程不安全的代码段,在该代码段执行结束之后,其他线程才能执行该代码段。即对代码段加锁保护该代码段,以达到同一时刻最多一个线程能够访问的目的。

相关文章

  • kotlin实现单例模式

    1.懒汉式实现单例模式 2.线程安全懒汉式实现单例模式 3.双重校验懒汉式实现单例模式 4.静态内部类方式实现单例模式

  • Android设计模式总结

    单例模式:饿汉单例模式://饿汉单例模式 懒汉单例模式: Double CheckLock(DCL)实现单例 Bu...

  • 单例模式

    饿汉模式: 懒汉模式: Double CheckLock(DCL)实现单例 静态内部类实现单例 枚举单例 使用容器...

  • 单例模式有几种写法?

    懒汉模式 懒汉是变种最多的单例模式。我们从懒汉出发,通过其变种逐渐了解实现单例模式时需要关注的问题。 基础的懒汉 ...

  • 单例模式Java篇

    单例设计模式- 饿汉式 单例设计模式 - 懒汉式 单例设计模式 - 懒汉式 - 多线程并发 单例设计模式 - 懒汉...

  • Java单例模式

    1. 实现单例模式 饿汉模式和懒汉模式单例模式根据实例化时机分为饿汉模式和懒汉模式。饿汉模式,是指不等到单例真正使...

  • 单例模式

    什么是单例? 在整个系统当中只允许一个实例存在。 单例的实现: (1)懒汉模式 /** * 懒汉模式 *...

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

    目录 1.单例模式简介 2.单例模式关键点 3.单例模式UML图 4.单例模式的实现方式饿汉式懒汉式同步锁懒汉式D...

  • 单例模式之枚举类enum

    通过枚举实现单例模式 枚举类实现单例模式的优点 对于饿汉式单例模式和懒汉式单例模式了解的同学,使用以上两种单例模式...

  • java的单例模式

    饿汉单例模式 懒汉单例模式

网友评论

      本文标题:懒汉单例模式 C++实现

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