• 单例模式在Java语言中,有两种构建方式


    • 懒汉方式。指全局的单例实例在第一次被使用时构建。
    • 饿汉方式。指全局的单例实例在类装载时构建。

    Java编程语言中,单例模式(饿汉模式)应用的例子如下述代码所示:

      public class Singleton {
        private final static Singleton INSTANCE = new Singleton();
     
        // Private constructor suppresses   
        private Singleton() {}
     
        // default public constructor
        public static Singleton getInstance() {
            return INSTANCE;
        }
      }
    

    Java编程语言中,单例模式(懒汉模式)应用的例子如下述代码所示 (此种方法只能用在JDK5及以后版本(注意 INSTANCE 被声明为 volatie),之前的版本使用“双重检查锁”会发生非预期行为[1]):

      public class Singleton {
        private static volatile Singleton INSTANCE = null;
     
        // Private constructor suppresses 
        // default public constructor
        private Singleton() {}
     
        //thread safe and performance  promote 
        public static  Singleton getInstance() {
            if(INSTANCE == null){
                 synchronized(Singleton.class){
                     //when more than two threads run into the first null check same time, to avoid instanced more than one time, it needs to be checked again.
                     if(INSTANCE == null){ 
                         INSTANCE = new Singleton();
                      }
                  } 
            }
            return INSTANCE;
        }
      }
    

    在C++编程语言中,单例模式应用的例子如下述代码所示(这里仅仅提供一个示例,这个例子对多线程的情况并不是安全的):

    // ...
     
    class lock
    {
        public:
            lock();
            lock(lock const & l);
            ~lock();
            lock & operator =(lock const & l);
            void request();
            void release();
        // ...
    };
     
    lock::lock()
    {
        // ...
    }
     
    // ...
     
    lock::~lock()
    {
        // ...
    }
     
    // ...
     
    void lock::request()
    {
        // ...
    }
     
    void lock::release()
    {
        // ...
    }
     
    // ...
     
    // assumes _DATA_TYPE_ has a default constructor
    template<typename _DATA_TYPE_>
    class singleton
    {
        public:
            static _DATA_TYPE_ * request();
            static void release();
     
        private:
            singleton();
            singleton(singleton<_DATA_TYPE_> const & s);
            ~singleton();
            singleton<_DATA_TYPE_> & operator =(singleton<_DATA_TYPE_> const & s);
            static _DATA_TYPE_ * pointer;
            static lock mutex;
        // ...
    };
     
    template<typename _DATA_TYPE_>
    _DATA_TYPE_ * singleton<_DATA_TYPE_>::pointer = 0;
     
    template<typename _DATA_TYPE_>
    lock singleton<_DATA_TYPE_>::mutex;
     
    template<typename _DATA_TYPE_>
    _DATA_TYPE_ * singleton<_DATA_TYPE_>::request()
    {
        if(singleton<_DATA_TYPE_>::pointer == 0)
        {
            singleton<_DATA_TYPE_>::mutex.request();
     
            if(singleton<_DATA_TYPE_>::pointer == 0)
            {
                singleton<_DATA_TYPE_>::pointer = new _DATA_TYPE_;
            }
     
            singleton<_DATA_TYPE_>::mutex.release();
        }
     
        return singleton<_DATA_TYPE_>::pointer;
    }
     
    template<typename _DATA_TYPE_>
    void singleton<_DATA_TYPE_>::release()
    {
        if(singleton<_DATA_TYPE_>::pointer != 0)
        {
            singleton<_DATA_TYPE_>::mutex.request();
     
            if(singleton<_DATA_TYPE_>::pointer != 0)
            {
                delete singleton<_DATA_TYPE_>::pointer;
     
                singleton<_DATA_TYPE_>::pointer = 0;
            }
     
            singleton<_DATA_TYPE_>::mutex.release();
        }
    }
     
    template<typename _DATA_TYPE_>
    singleton<_DATA_TYPE_>::singleton()
    {
        // ...
    }
     
    // ...
     
    int main()
    {
        int * s;
     
        s = singleton<int>::request();
     
        // ...
     
        singleton<int>::release();
     
        return 0;
    }
    
  • 相关阅读:
    BZOJ3501 : PA2008 Cliquers Strike Back
    BZOJ3500 : PA2008 Cliquers
    BZOJ2280 : [Poi2011]Plot
    BZOJ2924 : [Poi1998]Flat broken lines
    BZOJ2911 : [Poi1997]The Number of Symmetrical Choices
    BZOJ2612 : [Poi2003]Sums
    BZOJ4025 : 二分图
    BZOJ2213 : [Poi2011]Difference
    BZOJ2215 : [Poi2011]Conspiracy
    BZOJ2278 : [Poi2011]Garbage
  • 原文地址:https://www.cnblogs.com/SunDexu/p/2759418.html
Copyright © 2020-2023  润新知