爲何使用單件模式?java
有一些對象咱們只須要一個,比方說:線程池、緩存等等,若是同時實例化了多個對象反而會出現一些問題。程序員
對於這種類,僅靠程序員憑照約定不實例化,顯然是不可靠的。 緩存
嘗試:建立一個類,把全部的方法和變量都設置成靜態的,把類直接當作一個單件使用。安全
問題:由於靜態初始化的控制權是在java手上,這麼作可能致使混亂,特別是當有許多類牽涉其中的時候。多線程
嘗試:使用全局變量代替單件模式。函數
問題:在Java中,全局變量基本上就是對對象的靜態引用。缺點一,急切實例化VS延遲實例化。缺點二,不能確保只有一個實例。性能
什麼是單件模式?spa
定義:確保一個類只有一個實例,並提供一個全局訪問點。線程
怎麼用單件模式?code
將構造器設置爲private,即只有類自己才能調用本身的構造函數;
爲類設置一個靜態方法getInstance()來建立或獲取這個實例。
處理多線程:
方法一:同步getInstance()方法,直接給該方法添加synchronize關鍵字便可
適用狀況:getInstance()方法不被頻繁運行,或性能不是很關鍵。
方法二:急切實例化,即在靜態初始化器中建立單件,可以保證線程安全
public class Singleton{ private static Singleton uniqueInstance=new Singleton(); private Singleton(){} public static Singleton getInstance(){ return uniqueInstance; } )
適用狀況:應用老是建立單件,適用單件很頻繁
方法三:雙重檢查加鎖
public class Singleton{ private volatile static Singleton uniqueInstance;//必須有volatile關鍵字,確保初始化成實例時,多個線程正確地處理該變量 private Singleton(){} public static Singleton getInstance(){ if(uniqueInstance==null){ synchronized(Singleton.class){ if(uniqueInstance==null){ uniqueInstance=new Singleton(); } } } return uniqueInstance; } )
適用變量:java5之後可使用,性能很好。