設計模式之單例模式

2021-10-11 02:52:42 字數 999 閱讀 3668

在平常的程式設計中,有一些物件我們只需要乙個,比如:執行緒池、快取、日誌物件,對於這類物件,我們只需要它在全域性中存在乙份,如果存在多份,就會發生不可預知的問題。這個時候,單例模式就可以非常好的解決這類問題。

單例模式主要分為兩種,懶漢式和餓漢式。

正如其名一樣,懶漢式就是程式比較懶,一開始不初始化好物件(類載入時就未初始化),等我需要的時候,我才去初始化它。

而餓漢式呢,則是這個物件急需使用,一開始就初始化好了(類載入時就完成了初始化),等我要用的時候直接用就行了。

如上圖懶漢式,在單執行緒的情況下,這樣是沒有問題的,但是在多執行緒情況下,2個執行緒同時進入 判空語句,就會產生2個不同的物件,這樣就會產生執行緒安全的問題,最直接的方法就是加鎖。

但是加鎖存在乙個問題,就是對整個方法都加了鎖,會造成方法效率的大幅度下降,大概會下降100倍,如果你的程式對效率要求不高的話,可以用這個,對效率要求比較高的話,則有一種更適合的模式,"雙重檢查加鎖":

volatile 關鍵字用於保證物件被初始化時,多個執行緒能正確的處理obj變數,它是如何能保證obj變數能夠被正確的處理呢?

主要是在volatile修飾的物件讀寫加上記憶體屏障,volatile的寫對所有的執行緒第一時間可見,獲取的單例物件不會是沒有初始化完的物件,這樣使用才不會出問題。第一次判斷物件不等於空時才進入,如果物件被建立了,就不用再進入同步**塊當中,synchronized關鍵字只會被執行一次,第二次判斷是進入區塊後,再檢查一次,物件為空才會建立物件。

設計模式之單例模式

前一段時間買了一本秦小波寫的 設計模式之禪 網上對這書的評價很高。現在還沒有看很多,但是有些地方頗有感觸,也並不是所有的地方都能看懂,但是會慢慢研究的。自己對於設計模式的感覺就是乙個字 牛!感覺會23種設計模式並且會熟練運用的人,真的就是大師級的牛人了,設計模式是乙個專案主管或者架構師一定要會的東西...

設計模式之單例模式

package com.xie.singleton public class singleton 提供乙個共有的靜態的入口方法 public static singleton getinstance 懶漢式 延遲載入 提供乙個私有的靜態的成員變數,但不做初始化 private static sing...

設計模式之 單例模式

單例模式 singleton 保證乙個類僅有乙個例項,並提供乙個訪問它的全域性訪問點。單例模式 單件模式 使用方法返回唯一的例項 public class singleton private static singleton instance public static singleton geti...