欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Singleton Pattern

程序员文章站 2024-03-20 20:35:52
...

Singleton Pattern 的两种实现对比

  1. Single check 对对象创建锁保护
  2. 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的。

相关标签: singleton