JoeChenzzz

导航

单例模式

1.概念

1)单例模式就是一个类只能被实例化一次 ,更准确的说是只能有一个实例化对象的类

2)为什么要有单例模式:一则,解决多线程并发访问的问题;二则节约系统资源

  • 例如,一个系统中可以存在多个打印任务,但是只能有一个正在工作的打印任务
  • 如在Windows中就只能打开一个任务管理器,如果不使用机制对窗口对象进行唯一化,将弹出多个窗口,如果这些窗口显示的内容完全一致,则是重复对象,浪费内存资源;如果这些窗口显示的内容不一致,则意味着在某一瞬间系统有多个状态,与实际不符,也会给用户带来误解,不知道哪一个才是真实的状态

3)懒汉模式:比较懒,在类加载时,不创建实例,因此类加载速度快,但运行时获取对象的速度慢

4)饿汉模式:在类加载时就完成了初始化,所以类加载较慢,但获取对象的速度快

5)选择:

  • 由于要进行线程同步,所以在访问量比较大,或者可能访问的线程比较多时,采用饿汉实现,可以实现更好的性能,这是以空间换时间。
  • 在访问量较小时,采用懒汉实现,这是以时间换空间

2.实现代码

class single {    //懒汉模式
private:
    single() {}    //把构造函数设为private,不让外界直接生成实例
    static single* p;    //设置成静态成员,表示在类中只有一份

public:
    static pthread_mutex_t mex;     //静态函数只能使用静态数据成员
    static single* get()    //外界通过调用这个public函数去获得实例
    {
        if (p == NULL)
        {
            pthread_mutex_lock(&mex);//如果两个线程同时获取实例化对象,这样就会造出两个实例了,所以要加锁
            p = new single();
            pthread_mutex_unlock(&mex);
        }
        else
            return p;
    }
};
single* single::p = NULL;   //开始时不主动创建实例
pthread_mutex_t single::mex;

int main()
{
    pthread_mutex_init(&mex, 0);
    single* a = single::get();
    single* b = single::get();
    cout << a << endl << b << endl;

    return 0;
}

运行结果:

class single {    //饿汉模式
private:
    single() {}    //把构造函数设为private,不让外界直接生成实例
    static single* p;

public:
    static single* get()//外界通过调用这个public函数去获得实例
    {
        return p;
    }
};
single* single::p = new single();//在外界会调用 single::get()之前这个类就已经被实例化了,所以不会出现多线程的安全问题

int main()
{
    single* a = single::get();
    single* b = single::get();
    cout << a << endl << b << endl;

    return 0;
}

运行结果:

参考资料:

https://www.cnblogs.com/dupengcheng/p/7205527.html

posted on 2019-03-14 17:54  JoeChenzzz  阅读(316)  评论(0)    收藏  举报