【極客思考】設計模式:你確定你真的理解了單例模式嗎?
阿新 • • 發佈:2020-05-27
摘要:單例模式是建立型別中常用的一種設計模式。該模式下的類有且僅有一個例項。
什麼是單例模式?
說到單例模式,其實大家應該都不陌生,因為真的太常用了,應該所有開發者接觸設計模式的第一個模式。那我這裡一句話簡單說下為何使用單例:如果你希望你的某個類只需要有一個例項物件,並且全域性共享,那麼你就使用單例。 我喜歡的單例模式實現 單例模式是建立型別中常用的一種設計模式。該模式下的類有且僅有一個例項。單例模式常見的實現有懶漢式、餓漢式這兩種方式,但是在這裡,我不想討論這兩種方式,因為常見所以沒有討論和需要思考的價值。 讓我們來看看以下的幾種方式的一些實現機制:一、雙重校驗鎖(DCL)
private volatile static Singleton singleton為什麼要用volatile去修飾呢,這邊從兩個方面去說明: 1.如果不用volatile修飾會怎麼樣? 這看起來似乎也是行的通的,但是瞭解過編譯器和程式指令的話就會知道那是不可靠的,具體原因如下:
- 編譯器優化了程式指令,以加快cpu處理速度。
- 多核cpu會動態調整表指令順序,以加快並行運算能力。
- 執行緒A,呼叫方法獲取例項,發現物件未例項化,準備開始例項化。
- 由於編譯器優化了程式的指令,允許物件在建構函式未呼叫完成前,將共享變數的引用指向部分構造的物件,雖然物件未完全例項化,但是已經不為null了。
- 執行緒B進入也要呼叫方法獲取例項,發現部分構造的物件已經不為null,則直接返回了該物件。