Singleton(单件) 模式:
      保证一个类只有一个实例,并且提供一个访问它的全局访问点。
      假设有一个太阳类 Sun:

class Sun

{

public:

       Sun(){}

       ~Sun(){}

       static Sun* GetInstance()

       {

              if( m_pInstance == NULL)

                     m_pInstance = new Sun();

              return m_pInstance;

       }

private:

       Sun* m_pInstance;

}

Sun*       Sun::m_pInstance = NULL;


      这样,当有另外一个类的对象调用Sun 类的 GetInstance() 方法时,它只会返回唯一一个Sun对象。当有些类要被频繁地调用时,如果每次调用都要进行实例化,那开销是十分大的,这时候我们就可以考虑一下用这个模式。然而这个模式只适用于但线程,如果用于多线程,两个或以上的对象同时调用这个实例的时候,就会涉及到线程互斥的问题了。
      把Singleton模式修改一下,使它适合用于多线程,这就是Double Checked Locking 模式所要解决的问题。

 

class Sun

{

public:

       Sun(){}

       ~Sun(){}

 

       static Sun* GetInstance()

       {

if( m_pInstance == NULL)

{

//处理线程互斥

 

                     if( m_pInstance == NULL)

                            m_pInstance = new Sun();

}

              return m_pInstance;

       }

 

private:

       Sun* m_pInstance;

}

Sun*       Sun::m_pInstance = NULL;


      只需要在 GetInstance()方法里面改一下,加一段线程互斥处理的代码,其它不变。
 


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理