1.不靠谱之单例模式
很容易写出如下代码,通过Singleton类中的static函数去获取唯一的static指针变量,同时把Singalton类的构造函数设置为private,不允许手动构造出多个对象。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
#include "iostream"
using
namespace
std;
class
Singleton
{
private
:
Singleton(){}
static
Singleton *singleObject;
public
:
static
Singleton * getSingleObject()
{
if
(singleObject==NULL)
{
singleObject =
new
Singleton();
}
return
singleObject;
}
};
Singleton * Singleton::singleObject;
main()
{
Singleton * p= Singleton::getSingleObject();
}
|
该代码的问题是,多线程访问getSingleObject函数时,可能存在临界情况,构建出多个SingleObject类。、
2.带锁定单例模式(懒汉模式)
利用双重检查线程锁,可以减少线程同步/竞争开销。同时避免多线程访问不安全情况。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
class
Singleton
{
private
:
Singleton(){}
static
Singleton *singleObject;
public
:
static
Singleton * getSingleObject()
{
if
(singleObject==NULL)
{
lock();
if
(singleObject==NULL)
{
singleObject =
new
Singleton();
}
unlock();
}
return
singleObject;
}
};
|
3.饿汉模式
同时,可以在程序中初始化一次唯一的singleObject指针。这样可以避免线程的锁开销,代码也更简洁。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
#include "iostream"
using
namespace
std;
class
Singleton
{
private
:
Singleton(){}
static
Singleton *singleObject;
public
:
static
Singleton * getSingleObject()
{
return
singleObject;
}
};
Singleton * Singleton::singleObject =
new
Singleton();
main()
{
Singleton * p= Singleton::getSingleObject();
}
|
原文地址:
https://www.cnblogs.com/hebaichuanyeah/p/5608209.html