细说Singleton模式2.pptVIP

  • 1
  • 0
  • 约2.49千字
  • 约 8页
  • 2017-06-02 发布于河南
  • 举报
细说Singleton模式2

细说Singleton模式 创建、多线程与销毁 二 2.多线程   在解一中,如果我们运行在多线程的环境中,该方案是完美的么,将会有什么后果呢?   后果就是会造成内存泄漏,并且有可能前后获取的Singleton对象不一样(原因请自己思考,后面有解答)。   为了解决这个问题,将解一的Instance改为如下:   38.Singleton Singleton::Instance(){   39.Lock(m_mutex); //含义为获取互斥量 //1   40.If( !m_pInstance ){ //2   41.m_pInstance = new Singleton; //3 42.}   43.UnLock(m_mutex); //4   44.return *m_pInstance; //5   45.}   46.   此种方法将解决解一运行在多线程环境下内存泄漏的问题,但带来的结果是,当m_mutex被锁定时,其它试图锁定m_mutex的线程都将必须等等。并且每次执行锁操作其付出的代价极大,亦即是这种方案的解决办法并不吸引人。 那么我们将上面的代码改为如下方式:   47.Singleton Singleton::Instance(){   48.If( !m_pInstance ){ //1   49.Lock(m_mutex); //含义为获取互斥量 //2   50.m_pInstance = new Singleton; //3   51.UnLock(m_mutex); //4   52.}   53.return *m_pInstance; //5 54.}   55.   这样修改的结果没有问题了么?NO!!!!该方案带来的结果同解一,原因也一样,都将造成内存泄漏。此时“双检测锁定”模式就粉墨登场了。   由Doug Schmidt和Tim Harrison提出了“双检测锁定”(Double-Checked Locking)模式来解决multithread singletons问题。   56.Singleton Singleton::Instance(){   57.If( !m_pInstance ){ //1   58.Lock(m_mutex); //含义为获取互斥量 //2   59.If(!m_pInstance) //3   60.m_pInstance = new Singleton; //4 61.UnLock(m_mutex); //5   62.}   63.return *m_pInstance; //6   64.}   请看上面的第三句,这句话是不是具有化腐朽为神奇的力量啊 ^_^   上面的方案就完美了么。回答还是NO!!!(各位看官是否已经郁闷了啊,这不是玩我啊?请耐心点,听我细细到来^_^)   如果在RISC机器上编译器有可能将上面的代码优化,在锁定m_mutex前执行第3句。这是完全有可能的,因为第一句和第3句一样,根据代码优化原则是可以这样处理的。这样一来,我们引以为自豪的“双检测锁定”居然没有起作用( L) 怎么办?解决呗。怎么解决?简单,我们在m_pInstance前面加一个修饰符就可以了。什么修饰符呢?……   àvolatile(简单吧)   那么我们完整的解法如下:   65./*解三*/   66.class Singleton   67.{   68.public:   69.static Singleton Instance(){ //1   70.if( !m_pInstatnce){ //2   71.Lock(m_mutex) //3 72.If( !m_pInstance ) //4   73.m_pInstance = new Singleton;//5   74.UnLock(m_mutex); //

文档评论(0)

1亿VIP精品文档

相关文档