剑指offer-面试题2.实例Singleton模式

本文深入探讨单例模式的概念及其在多线程环境下的同步实现策略,通过详细解析类的设计,展示了如何确保同一类仅能生成一个实例,并在多线程环境下保持唯一性。

题目:设计一个类,我们只能生成该类的一个实例

 

这道题显然是对设计模式的考察,很明显是单例模式。什么是单例模式呢,就是就像题目所说的只能生成一

个类的实例。那么我们不难考虑到下面几点:

1.不能new多个对象,那么必然该类的构造函数是私有的

2.类对象只有一个,那么必然该对象只能有一个私有的静态成员变量,该成员变量为类实例或者类实例的指针。

3.但是我们同时还要考虑到如果获取这个唯一对象实例,那么该类必然有一个公有的成员函数来获取这个唯一的

类实例然而由于不允许new对象,那么必须提供一种类操作该接口的方式,很显然就是静态成员函数。

 

至此不难写设计出这样一个类:

 1 class CSingle
 2 {
 3 private:
 4     CSingle()  //私有构造函数,禁止new对象实例
 5     {
 6     }
 7     static CSingle *m_pInstance;  //私有静态全局变量,保证唯一性
 8 public:
 9     static CSingle * GetInstance()  //提供一个共有接口获取该唯一类实例
10     {
11         if(m_pInstance == NULL)
12             m_pInstance = new CSingle();
13         return m_pInstance;
14     }
15 };

 

 

那么我们构造这个唯一实例是这样的:

1 CSingle *Single=CSingle::GetInstance();//当该唯一实例不存在时,这是唯一获取类实例的方法。

 

1 CSingle *Single1=Single->GetInstance();//当上一步执行后便可用此方法获取唯一类实例

 

当然也可以这样

1 CSingle & Single1=Single->GetInstance();

 

 

上面的做法对于单线程来说可以表现的很好了,但是对于多线程来说,就可能有问题了。当两个线程

同时创建实例的时候,这时候实例不存在,这时候就可能产生两个类实例,于是我们就需要用同步的方

法保证创建的时候只有一个线程。线程同步的方法很多,可以是临界区,可以是互斥等。

 

转载于:https://www.cnblogs.com/vpoet/p/4662728.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值