深入淺出設計模式五 獨一無二 單例模式)

2021-08-30 12:25:21 字數 1307 閱讀 1589

先看文章 :

public class singleton 

private static singleton st = new singleton();//這句話保證了執行緒安全。

//在類載入的時候初始化,new出物件,也就是說每載入一次類就new 一次

public static singleton getinstance() }

class lazysingleton

private static lazysingleton st = null;

//第一次載入,對st初始化為null,呼叫getinstance方法後,對st進行例項化。

//以後再載入的時候會發現st已經指向了物件,直接執行return st.

//要保證執行緒安全,必須加synchronized關鍵字。

public static synchronized lazysingleton getinstance()}/*

* 對第二種利用synchronized保證執行緒安全的情況進行改進,因為執行緒安全問題只出現在第一次呼叫getinstance方法時,

* 檢查執行緒的安全性。注意volatile關鍵字的使用。這叫「雙重檢查加鎖」,減少使用同步。

*/class doublechecksingleton

private volatile static doublechecksingleton st ;

public static doublechecksingleton getinstance()}}

return st; }}

class test

}

關於關鍵字:volatile

volatile修飾的成員變數在每次被執行緒訪問時,都強迫從共享記憶體中重讀該成員變數的值。而且,當成員變數發生變化時,強迫執行緒將變化值回寫到共享記憶體。這樣在任何時刻,兩個不同的執行緒總是看到某個成員變數的同乙個值。
使用建議:在兩個或者更多的執行緒訪問的成員變數上使用volatile。當要訪問的變數已在synchronized**塊中,或者為常量時,不必使用。
在大多數情況下,把變數快取在暫存器中是乙個非常有價值的優化方法,如果不用的話很可惜。c和c++給你提供了顯式禁用這種快取優化的機會。如果你宣告變數是使用了volatile修飾符,編譯器就不會把這個變數快取在暫存器裡——每次訪問都將去訪問變數在記憶體中的實際位置

由於使用volatile遮蔽掉了vm中必要的**優化,所以在效率上比較低,因此一定在必要時才使用此關鍵字

獨一無二的單例模式

單例模式被定義為 確保乙個類只有乙個例項,並提供乙個全域性訪問點。單例模式使得乙個類只能有唯一的乙個例項,這意味著不能再使用new關鍵字建立物件,因為一旦可以被new,就可以被多次new。問題1 如何保證乙個類只有乙個例項?問題2 不能使用new如何獲取物件?這兩個問題的答案非常簡單 由於new物件...

設計模式系列 搞懂單例模式,我獨一無二

單例模式的定義 乙個類只有乙個例項,且該類能自行建立這個例項,並提供乙個訪問該單例的全域性訪問點。屬於建造型模式。單例模式的實現 餓漢式單例 類載入的時候即初始化並建立單例物件。適用於單例物件較少的情況。public class hungrysingleton public static hungr...

單例模式 建立獨一無二的物件

單例模式 singleton pattern 用來建立獨一無二的,只能有乙個例項的物件的入場券。作用 有些物件我們只需要乙個,比如 執行緒池 快取 對話方塊 處理偏好設定 登錄檔等物件,這些物件只能有乙個例項,如果製造出多個例項,就會導致很多問題產生,例如 程式行為異常 資源使用過量 或者是不一致的...