單例模式-singleton

1.    什麼是單例模式?
       一個類有且僅有一個實例,而且自行實例化向整個系統提供。
2.   特色
     a.  一個類只有一個實例
     b.  必須自行建立該實例
     c.  必須自行向整個系統提供該實例
     d.  不能被繼承
3.   單例模式的做用?
      保證系統中一個類只有一個實例並且該實例易於外界訪問,從而方便對實例個數的控制並節約系統資源。
4.   單例模式實現方式?
      a. 餓漢式     
        
public class Singleton {  
    private static EagerSingleton instance = new EagerSingleton();
    private Singleton() { //私有構造函數  }    
    public static EagerSingleton getInstance()
    {
        return instance;
    }    
}
     b. 懶漢式
        // 懶漢式---存在線程安全問題---會產生多個實例
 
public class SingletonClass{
        private static SingletonClass instance=null;
        private SingletonClass(){}
        public static SingletonClass getInstance(){
        if(instance==null){
           instance=new SingletonClass();
            }
        }
        return instance;
        }
    }
    // 懶漢式---不存在線程安全問題------效率比較低
   
public class SingletonClass{
        private static SingletonClass instance=null;
        private SingletonClass(){}
        public static synchronized SingletonClass getInstance(){
        if(instance==null){
           instance=new SingletonClass();
            }
        }
        return instance;
        }
    }
    // 懶漢式---不存在線程安全問題-----效率高
  
public class SingletonClass{
        private static SingletonClass instance=null;
        private SingletonClass(){}
        public static SingletonClass getInstance(){
        if(instance==null){
            synchronized(SingletonClass.class){
            if(instance==null){
                instance=new SingletonClass();
            }
            }
        }
        return instance;
        }
    }
    說明:synchronized方法與synchronized代碼快的區別
         synchronized methods(){} 便於閱讀理解;
         synchronized(this){}能夠更精確的控制衝突限制訪問區域,有時候表現更高效率。
5.   單例模式實現方式的區別:
     餓漢式:在類加載時就完成了初始化,因此類加載較慢,但獲取對象的速度快
     懶漢式:在類加載時,不建立實例,所以類加載速度快,但運行時獲取對象的速度慢
6.   單例模式應用:
     a. 在線人數;
     b. windows任務管理器----只能打開一個;
     c. windows回收站;
     d. 應用程序的日誌應用---在整個系統運行過程當中,回收站一直維護者僅有的一個實例;
     e. web應用的配置對象的讀取---配置文件是共享的資源;
     f. 數據庫鏈接池的設計---採用單例能節省打開或關閉數據庫鏈接所引發效率損耗;

 7. 線程安全與CPU核數有關嗎? java

    無關,只是在單核狀況下,有些問題復現機率更低。 web

相關文章
相關標籤/搜索