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

  1. —饿汉和懒汉的安全线程单例模式—
  2. 饿汉模式
  3. 懒汉模式

—饿汉和懒汉的安全线程单例模式—

​ 单例模式分为饿汉和懒汉模式,饿汉是线程安全的,懒汉线程不安全

饿汉模式

​ 饿汉在进入main前初始化一次实例对象,因此本身就是线程安全的单例模式

class hungry_mode
{
public:
    static hungry_mode* distance()
    {
        return m_obj;
    }
    void print()
    {
        cout << "哈哈哈哈哈" << endl;
    }


private:
    hungry_mode() { cout << "enter 构造函数" << endl; }
    static hungry_mode *m_obj;


    hungry_mode(const hungry_mode&) = delete;     //拷贝构造删除
    hungry_mode& operator=(const hungry_mode&) = delete;  //赋值构造删除

};

//初始化对象一次
hungry_mode* hungry_mode::m_obj = new hungry_mode;
c++ arduino复制代码
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

懒汉模式

​ 懒汉在需要进行实例化对象的时候实例化,会出现多线程竞争的问题,因此创建的时候需要加锁,又因为创建实例化对象一次后不在创建该对象,因此在加锁前在进行一次判断,这样可以避免线程每次进入都要加锁判断,造成性能降低。

class lazy_mode
{
public:
    static lazy_mode* instance()
    {
        if (m_obj == nullptr)
        {
            pthread_mutex_lock(&mut);
            if (m_obj == nullptr)
            {
                m_obj = new lazy_mode;

            }
            pthread_mutex_unlock(&mut);
        }
        return m_obj;
    }
    
    void print()
    {
        cout << "哈哈哈哈哈" << endl;
    }

private:
    lazy_mode();
    

    static lazy_mode* m_obj;
    static pthread_mutex_t mut;
    lazy_mode(const lazy_mode&) = delete;
    lazy_mode& operator=(const lazy_mode&) = delete;

};

lazy_mode* lazy_mode::m_obj = nullptr;
pthread_mutex_t lazy_mode::mut = PTHREAD_MUTEX_INITIALIZER;
c++ arduino复制代码
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36

转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 351134995@qq.com

×

喜欢就点赞,疼爱就打赏