頻道欄目
首頁 > 資訊 > Java > 正文

java設計模式之單例模式解析

18-05-07        來源:[db:作者]  
收藏   我要投稿

java設計模式之單例模式解析。

單例模式(Singleton Pattern):確保一個類只有一個實例,并提供一個全局訪問點來訪問這個實例。

某些類,如id生成器等,只能有一個,需要使用單例模式。 單例模式的要點:一個類只能有一個實例、類必須自行創建這個實例、類必須自行向系統提供這個實例。

結構和實現

單例模式只有一個單例類,在內部創建唯一實例,通過靜態方法提供這個實例。private的構造方法可以防止單例類在外部被實例化。 單例結構。
單例模式實現方式有很多:餓漢式、懶漢式、靜態內部類、枚舉類。

餓漢式單例

類加載時創建對象,實現簡單。

懶漢式單例

在第一次調用getInstance時實例化,稱為延時加載。
可以使用 synchronized加鎖方法 或者雙重檢查鎖定來處理多線程問題。
synchronized鎖定對getInstance靜態方法的調用,確保只有一個線程調用方法,但是每次調用該方法均要進行線程鎖定判斷,性能較低。 雙重檢查的原因:某一瞬間線程A和B均通過的第一重判斷,A進入鎖定的代碼塊,創建實例結束后,B進入鎖定的代碼塊,需要第二重判斷防止B再次創建實例。 volatile關鍵字強制線程從主內存中取變量,而不是線程的本地內存,這樣對該變量的改變線程之間是可見的。但是這也會屏蔽一些JVM的優化。volatile關鍵字原理。

靜態內部類單例

餓漢式單例一開始就會消耗系統的資源,懶漢式單例線程控制復雜、性能受限。 可以使用靜態內部類儲存創建的單例,第一次調用getInstance方法的時候加載內部類HolderClass,初始化其中的靜態變量instance。線程安全性由JVM保證,確保instance只被初始化一次。
靜態內部類可以實現延遲加載、保證線程安全、不影響性能,但是受編程語言限制,某些語言不支持。

枚舉單例

使用enum類型儲存單例,類似靜態內部類,編程更加簡單,可以實現延遲加載、保證線程安全、不影響性能,但是受編程語言限制。

實例

開發負載均衡軟件,將并發訪問的數據分發到多個服務器上進行處理。由于服務器需要動態增減,并且用戶的請求需要統一分發,為了避免分配沖突問題,需要確保負載均衡器的唯一性。

優缺點和適用范圍

優點:
控制唯一實例的訪問。 節約資源。系統只存在一個該類的實例,對于需要頻繁創建和銷毀的類,可以提高性能。 控制類的數目。擴展單例模式,使一個類擁有指定數量的實例。 缺點:
無抽象層。擴展困難。 單例類職責過重。提供創建方法和業務方法,違反單一職責原則。 可能被回收。在提供自動垃圾回收的環境中,如果對象長時間不使用,會被回收,從而丟失對象的狀態。 適用環境:
系統只需要一個實例。如業務需要或者資源消耗太大。 調用只允許使用一個訪問點。

jdk中的應用

java.lang.Runtime,封裝了運行時環境,餓漢式單例。
public class Runtime {
    private static Runtime currentRuntime = new Runtime();
    private Runtime() {}
    public static Runtime getRuntime() {
        return currentRuntime;
    }
}
相關TAG標簽
上一篇:臺積電:絕大多數7nm客戶都會轉向6nm_IT新聞_博客園
下一篇:最后一頁
相關文章
圖文推薦

關于我們 | 聯系我們 | 廣告服務 | 投資合作 | 版權申明 | 在線幫助 | 網站地圖 | 作品發布 | Vip技術培訓 | 舉報中心

版權所有: 紅黑聯盟--致力于做實用的IT技術學習網站

美女MM131爽爽爽毛片