—饿汉和懒汉的安全线程单例模式—
单例模式分为饿汉和懒汉模式,饿汉是线程安全的,懒汉线程不安全
饿汉模式
饿汉在进入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;
- 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;
- 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