設計模式(五) 單件模式(單例模式)

2021-10-08 06:01:08 字數 1946 閱讀 1627

三、單件模式的多執行緒安全問題

參考

確保乙個類只有乙個例項,並提供乙個全域性訪問點。

單件模式即單例模式。

使用場景很多,比如多個程式都要使用乙個配置檔案中的資料,而且要實現資料共享和交換。必須要將多個資料封裝到乙個物件中,而且多個程式操作的是同乙個物件,也就是說必須保證這個配置檔案物件的唯一性。

有兩種方式實現:餓漢式和懶漢式。

單件模式的急切例項化方式,上來就建立物件:

class

single

//3,定義乙個方法返回這個物件。該方法加上public,許可權最大。

public

static single getinstance()

}/**

* 演示

*/public

class

demo

}

如果建立的這個單件物件一直沒用到過,而且該物件也一直比較占用空間,那麼餓漢式並不是很完美的解決方法。

單例的延遲例項化方式,用到才建立物件:

class

single

//3,定義乙個方法返回這個物件。該方法是關鍵,加上public,許可權最大。

public

static single getinstance()

}/**

* 演示

*/public

class

demo

}

(1)私有化建構函式是為了禁止其它程式建立該類的物件,保證只有該類內部才能建立該類的物件。

(2)想獲取single類的物件就需要呼叫getinstance方法。既然無法通過物件呼叫,那麼只能用類名呼叫,所以getinstance方法必須是static。

(3)建立好物件後,因為uniqueinstance物件是靜態的,所以通過single.uniqueinstance這種方式是可以獲取物件的,但不推薦,用方法訪問是為了對物件可控,因此物件需加上private。

對比餓漢式和懶漢式兩種單件模式的實現,餓漢式沒有多執行緒安全問題,但是懶漢式是有多執行緒安全問題的。

初始的餓漢式實現:

class

single

//3,定義乙個方法返回這個物件。該方法是關鍵,加上public,許可權最大。

public

static single getinstance()

}

問題:假設現在uniqueinstance物件還是null,然後有多個執行緒同時呼叫getinstance()方法想獲得uniqueinstance物件,可能會出現多個執行緒都判斷uniqueinstance為空,接著就重複new了物件,這裡就出現多執行緒安全問題了。

上面分析發現:併發訪問會有安全隱患,所以加入同步機制解決安全問題。

class

single

//3,定義乙個方法返回這個物件。該方法是關鍵,加上public,許可權最大。

public

static single getinstance()

return uniqueinstance;

}}

問題:只有第一次執行此方法時,才真正需要同步。換句話說,一旦建立好uniqueinstance物件,就不再需要同步這個方法了。之後每次呼叫這個方法,同步都是一種累贅。

上面分析發現:同步的出現降低了效率。可以通過雙重判斷的方式,解決效率問題,減少判斷鎖的次數。

class

single

//3,定義乙個方法返回這個物件。該方法是關鍵,加上public,許可權最大。

public

static single getinstance()

}return uniqueinstance;

}}

《headfirst設計模式》

設計模式 單例(單件)模式

獨一無二的物件 有什麼用?有很多物件我們只需要乙個 eg 執行緒池 快取 登錄檔 日誌物件等。這些類我們只需要乙個,如果製造出多個例項,會導致許多問題的產生。eg 程式的行為異常 資源使用過量 結果不一致下面是單件模式的 public class singlemode 提供乙個公共獲取該類例項的靜態...

單件模式(單例模式)

readme 0.1 本文部分描述 head first 設計模式 旨在學習 單件模式 單例模式 的相關知識 及其應用 單件模式 1.0 單件模式的應用背景 有一些物件其實我們只需要乙個,比方說 執行緒池,快取,對話方塊,登錄檔等的物件,這都可以通過單件模式來解決 1.1 定義 確保乙個類只有乙個例...

單件模式(單例模式)

1 單件模式 確保乙個類只有乙個例項,並提供乙個全域性訪問點。2 經典的單件模式實現 public class singleton public static singleton getinstance return uniqueinstance 問題點 public static singleto...