java单例模式_Java描述设计模式(01):单例模式
生活随笔
收集整理的這篇文章主要介紹了
java单例模式_Java描述设计模式(01):单例模式
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
本文源碼:GitHub·點這里 || GitEE·點這里
一、單例模式
1、概念圖解
單例設計模式定義:確保這個類只有一個實例,并且自動的實例化向系統提供這個對象。2、樣例代碼
package Singleton稱為單例類,構造函數使用private修飾,確保系統中只能產生一個實例,并且自動生成的。上面代碼也就是所謂的懶漢式加載:只有到使用該對象的時候才來創建,意思餓了才來做飯吃。二、線程安全問題
在上面的代碼中存在一個很明顯的線程安全問題,當有多條線程來請求對象實例的時候,因為對象的創建是需要時間的,假設A線程進來判斷singleton == null,就會進入對象的創建過程,這時如果同時在過來幾條線程,那么他們都會得到一個對象實例,這個就是所謂的線程安全問題。1、同步控制方式
package這樣操作會影響系統性能
2、餓漢式加載
public這里先把對象創建出來,有需要直接使用;
3、雙重檢查
public4、枚舉方式
package三、延遲類初始化
1、基礎概念
1)、類級內部類
簡單點說,類級內部類指的是,有static修飾的成員式內部類。如果沒有static修飾的成員式內部類被稱為對象級內部類。類級內部類相當于其外部類的static成分,它的對象與外部類對象間不存在依賴關系,因此可直接創建。而對象級內部類的實例,是綁定在外部對象實例中的。
類級內部類中,可以定義靜態的方法。在靜態方法中只能夠引用外部類中的靜態成員方法或者成員變量。
類級內部類相當于其外部類的成員,只有在第一次被使用的時候才被會裝載。
2)、多線程缺省同步鎖
在多線程開發中,為了解決并發問題,主要是通過使用synchronized來加互斥鎖進行同步控制。但是在某些情況中,JVM已經隱含地執行了同步,這些情況下就不用自己再來進行同步控制了。這些情況包括:1.由靜態初始化器(在靜態字段上或static{}塊中的初始化器)初始化數據時 2.訪問final字段時 3.在創建線程之前創建對象時 4.線程可以看見它將要處理的對象時2、實現方式
要想很簡單地實現線程安全,可以采用靜態初始化器的方式,它可以由JVM來保證線程的安全性。比如前面的餓漢式實現方式,在類裝載的時候就初始化對象,不管是否需要,存在一定的空間浪費。一種可行的方式就是采用類級內部類,在這個類級內部類里面去創建對象實例。這樣一來,只要不使用到這個類級內部類,那就不會創建對象實例,從而同時實現延遲加載和線程安全。public
四、JDK源碼單例模式
Runtime單例實現源碼。
1、案例演示
/**2、源代碼分析
public基于餓漢模式實現的單例模式。
五、Spring框架中應用
1、創建測試類
public2、Spring配置文件
<!-- 單例Bean -->3、測試讀取Bean對象
package結論
Spring單例模式與純粹的單例設計模式的主要區別
盡管使用相同的類加載器來加載兩個應用程序上下文,但是UserBean的實例是不一樣的。也就是Spring框架中的單例對象是基于應用程序中。六、單例模式總結
1、注意事項
單例模式注意事項和細節說明
1) 單例模式保證了 系統內存中該類只存在一個對象,節省了系統資源,對于一些需要頻繁創建銷毀的對象,使用單例模式可以提高系統性能。2) 當想實例化一個單例類的時候,必須要記住使用相應的獲取對象的方法,而不是使用new Object() 的方式。
3) 單例模式使用的場景:需要頻繁的進行創建和銷毀的對象、創建對象時耗時過多或耗費資源過多(即:重量級對象),但又經常用到的對象。
2、優缺點
優點: 1、單例模式只會創建一個對象實例,減少內存消耗 2、設置全局訪問點,優化共享資源的訪問 缺點: 1、沒有接口,很難擴展 2、不利于測試 3、與單一職責原則沖突七、源代碼地址
GitHub·地址 https://github.com/cicadasmile/model-arithmetic-parent GitEE·地址 https://gitee.com/cicadasmile/model-arithmetic-parent總結
以上是生活随笔為你收集整理的java单例模式_Java描述设计模式(01):单例模式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java框架_2020年Java框架排行
- 下一篇: 显卡在电脑什么位置_DIY组装电脑教程,