在開發過程中,其實很多情況下,都需要用到單例模式來維持物件的唯一性。
比如執行緒池、資料來源、sessionfactory等。
一般的做法(懶漢式):
public
class myclass
//宣告乙個靜態方法來返或乙個單例物件
public
static myclass getinstance()
}
但是這個會在多執行緒下回導致資料不一致性。
這樣執行緒一跟執行緒二就獲得不同的例項物件,打破了唯一性。
這個問題就變為多執行緒問題,一般通過加鎖是可以解決問題的,比如:
public
class myclass
//宣告乙個靜態方法來返或乙個單例物件
//通過增加synchronized來保證同一時刻只有乙個執行緒可以執行getinstance()函式
public
static synchronized myclass getinstance()
}
但是這種加鎖方法會帶來效能問題,因為其實對於單例模式,只有在第一次初始化myclass的時候需要控制只有乙個執行緒可以進行例項化物件,對於之後的獲得物件,由於已經例項化了,是可以直接返回的,但是由於synchronized的宣告就降低了效能。
這樣就引出了「雙重檢查加鎖」概念,**如下:
public
class myclass
//宣告乙個靜態方法來返或乙個單例物件
//通過增加synchronized來保證同一時刻只有乙個執行緒可以執行getinstance()函式
//將鎖的粒度降低
public
static myclass getinstance()
}return myclass;
}}
這樣就保證了只有當第一次需要例項化物件的時候才會用到synchronized控制併發。
其實看到這,很多人會有乙個疑問,好像沒必要用到volatile關鍵字啊。
我第一次看見也是這麼覺得,後來檢視了一下資料,發現了「新大陸」。
主要原因就是編譯器為了一下優化操作,會執行指令重排。具體原因可以參考部落格:雙重檢查鎖定原理詳解
當然單例模式還有很多不同的實現方式,比如列舉等。
以上內容為《大話設計模式》的學習筆記
大話設計模式 單例模式
一 單例模式 保證乙個類僅有乙個例項,並提供乙個訪問它的全域性訪問點。二 例項 public class singleton public static singleton getinstance return singleton public class singletondousync publ...
大話設計模式 設計模式 單例設計模式
解決的問題 保證乙個類在記憶體中的唯一性。比如,必須要對於多個程式使用同乙個配置資訊時,就需要保證該物件的唯一性。原理 如何保證物件的唯一性呢?不允許其他程式使用new建立該類物件 在該類中建立乙個本類物件 對外提供乙個公共方法,使其他程式可以獲取該例項。步驟 私有化該類的建構函式 通過new在本類...
《大話設計模式》 筆記 單例模式
單例模式 保證乙個類僅有乙個例項,並提供乙個供訪問的全域性點。其它優點 單例模式因為是卦裝的它的唯一例項,這樣它可以嚴格地控制客戶怎樣訪問它以及何時訪問它。簡單的說就是對唯一例項的受控訪問。呼叫 以上方式存在不足。在多執行緒的程式中,多個執行緒同時訪問單例類,呼叫getinstance 方法,會有可...