走進設計模式的世界5:沒有例子,沒有故事,很嚴肅-單件模式
阿新 • • 發佈:2018-11-14
單件模式:
單件模式:確保一個類只有一個例項,並提供一個全域性訪問點。
解釋:單件模式 確保程式中一個類最多隻有一個例項。單件模式也提供訪問這個例項的全域性點。在java中實現單件模式需要有私有的構造器、一個靜態方法和一個靜態變數。確定在效能和資源上的限制,然後小心的選擇適當的方案來實現單件,以解決多執行緒問題(我們必須認定所有的程式都是多執行緒的)。jdk5 之前的雙重檢查鎖單例會失效。如果使用多個類載入器單件模式也會失效。
以下是一個簡單的單件例子
/** 簡單的單件實現 **/ public class Single{ // 一個靜態變數 private static Single single; // 一個私有的構造方法 private Single(){}; // 一個靜態方法 private Single getInstance(){ if(single!=null){ single = new Single(); } return single; } }
上面這個例子簡單確完整的實現了單件模式,但是卻存在多執行緒的隱患。所以我們進行了修改,讓獲取例項的方法多執行緒和也可用。
/** 鎖機制簡單的單件實現 **/ public class Single{ // 一個靜態變數 private static Single single; // 一個私有的構造方法 private Single(){}; // 一個靜態方法(對獲取的例項加鎖) private synchronized Single getInstance(){ if(single!=null){ single = new Single(); } return single; } }
這樣解決了多執行緒的問題,但是新的問題又出現了....就是效率問題,每次獲取例項就有可能被阻塞。如何進行優化呢?
/** 雙重檢查鎖單件實現 **/ public class Single{ // 一個靜態變數(運用了volatile關鍵字,讓single的改變直接放到共有記憶體區,保證變數的可見性) private volatile static Single single; // 一個私有的構造方法 private Single(){}; // 一個靜態方法(對獲取的例項加鎖) private synchronized Single getInstance(){ if(single!=null){ // 保證只有single屬性不為空的時候,對整個類加鎖。 synchronized(Single.class){ single = new Single(); } } return single; } }
沒了。