單例模式

一、單例模式定義:
在程序運行期間,一個類有且僅有一個實例對象。

二、單例模式需要解決的問題:
java創(chuàng)建對象時在棧中保存對象的引用,而真實的對象存在于堆內存中。當這個對象
失去所有引用,JVM會在空閑時、或堆內存不足時調用GC進行垃圾回收。而有些時
候我們沒有必要針對每一個線程創(chuàng)建一個對象,此時需要使用單例模式。例如:編
寫一個類負責讀取配置文件。很顯然配置文件僅僅在類初始化時讀取一次即可,沒
必要針對每個線程請求生成一個對象重新讀取,這樣做很大程度上消耗了系統(tǒng)性
能。這種情況是使用單例模式的一個典型應用場景。有些人在提到單例模式的缺點
時講到:單例模式一般職責過重,違背了單一職責原則。其實我認為這是一種誤區(qū)
單例模式仍然是一個普通的類,它仍然需要遵守程序設計原則編寫。職責過重并非
單例模式的設計存在缺陷,而是編程人員沒有遵循設計原則進行編碼。Spring默認
作用域下,每一個Bean都是單例的。是不是可以認為,使用Spring開發(fā)的任何項目
都違背了單一職責原則呢?任何一種設計模式都是如此,并非設計模式本身存在什
么問題,問題在于設計模式的濫用。

三、單利模式的實現(xiàn)方式:
單例模式典型的實現(xiàn)方式有兩種:餓漢式與懶漢式。還存在很多其他的方式,其實
都屬于兩種方式的變種。是對這兩種方式做出的優(yōu)化。我會在接下來的代碼中對這
幾種單 例模式進行介紹,更多是以代碼中加注釋的方式來解釋每一種設計模式。以
后的文章也會采取這種風格

四、餓漢式代碼實現(xiàn):


image.png
    餓漢式單例模式的特點:
    基于ClassLoader機制解決了多線程并發(fā)時的問題,是線程安全的。不具備懶加載
    的特性。

五、懶漢式代碼實現(xiàn):


image.png

經過雙重if校驗、sychronized、volatile關鍵詞處理后的懶漢式,解決了線程安全、
訪問阻塞的問題。

六、靜態(tài)內部類實現(xiàn)單例模式:


image.png

同樣利用了ClassLoader的機制解決了線程安全的問題,但由于在Singleton類被
被加載時SingletonHolder類沒有被使用,因此具有懶加載的特性。
七、枚舉:


image.png

默認情況下枚舉的創(chuàng)建是線程安全的。該方式能夠防止使用反射創(chuàng)建對象。由于枚舉是在初次訪問時才被加載,因此是具有懶加載特性的。該方式寫法簡潔。
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容