Singleton Pattern
程序员文章站
2024-03-20 20:35:52
...
Singleton Pattern 的两种实现对比
- Single check 对对象创建锁保护
- Double check
#include <iostream>
#include <mutex>
#include <chrono>
#include <ctime>
#define DOUBLE_CHECK (1)
using std::chrono::system_clock;
using std::chrono::milliseconds;
class Singleton
{
public:
static Singleton *instance() {
#if DOUBLE_CHECK == 1
// First check
if (instance_ == 0) {
std::lock_guard<std::mutex> lock(mutex_);
// Second check
if (instance_ == 0) {
instance_ = new Singleton();
}
}
return instance_;
#else
// single - check
std::lock_guard<std::mutex> lock(mutex_);
if (instance_ == 0) {
instance_ = new Singleton();
}
return instance_;
#endif
}
Singleton() : data_(0){
}
void printData() {
data_++;
}
private:
static Singleton *instance_;
static std::mutex mutex_;
int data_;
};
Singleton *Singleton::instance_ = 0;
std::mutex Singleton::mutex_;
#define EXECUTE_COUNT (10000 * 100)
int main(int argc, char **argv)
{
// start time
auto start = system_clock::now();
for (int i = 0; i < EXECUTE_COUNT; i++) {
Singleton::instance()->printData();
}
milliseconds totalTime = std::chrono::duration_cast<milliseconds>(system_clock::now() - start);
std::cout << "Execute Time: " << totalTime.count() << " ms" << std::endl;
return 0;
}
本机测试 Single-check: 479ms Double-check: 2ms
双重检查可以避免每次都需要获取锁才能检查示例是否已经创建,如果已经创建instance_一定不为0, 只有第一次需要进行锁保护,即使多线程都通过了第一次check,第二次check还会避免多次初始化,一次两重check的时间是远小于多次都要获取lock的。
上一篇: 文件上传显示保存到数据库实现类