單例模式與多執行緒

2021-09-21 03:52:37 字數 997 閱讀 2202

程式**:

上面的就是典型的「餓漢模式」,就是急不可耐,一上來就初始化物件。那能不能使用的時候才例項化物件呢?也就是希望延遲載入,這就是所謂的「懶漢模式」。程式**如下:

在併發情況下,多個執行緒同時「抵達」 if判斷這塊,那麼勢必物件會被多次new。那麼「懶漢模式」下,如何保證併發呢?簡單來說,我們可以在getinstance方法上直接打上synchronized即可,如下:

要知道此時鎖住的是class物件,多個執行緒之間單個進入方法執行,確實解決了問題。但是由於鎖的級別是在方法上,那麼每一次獲取單例,都不得不加鎖,效率太低,如何改進呢?

把synchronized的鎖範圍縮小,「貌似」解決了問題,實則不然。如果多個執行緒同時通過if判斷,那麼在synchronized處乙個個的通過的話,顯然會被new多次。因此,我們需要double check instance:

其實,除了上面的方式外,還有一種static inner class的方式,在保證多執行緒安全的情況下,更加高效、優雅:

通過靜態內部類的方式,同樣可以達到使用的時候才載入,而且完全避免了併發下的問題!在實際開發中也是使用最為廣泛的!

多執行緒 單例模式與多執行緒

一 前言 如何使單例模式遇到多執行緒是安全的 正確的?我們在學習設計模式的時候知道單例模式有懶漢式和餓漢式之分。簡單來說,餓漢式就是在使用類的時候已經將物件建立完畢,懶漢式就是在真正呼叫的時候進行例項化操作。二 餓漢式 多執行緒 public class myobject public static...

單例模式與多執行緒

立即載入就是使用類的時候已經將物件建立完畢,常見的實現辦法就是直接new例項化,在呼叫方法前例項已經被建立了.利用getinstance 獲得乙個物件.延遲載入就是在呼叫get 方法時例項才被建立,常見的實現辦法就是在get 方法中進行new例項化,在呼叫方法時例項才被建立.利用get 獲得乙個物件...

多執行緒 單例模式

單例模式 是非常典型常用的一種設計模式 乙份資源只能被申 載一次 單例模式的方法建立的類在當前程序中只有乙個例項 資源的程式初始化的時候就去載入,後面使用的時候直接使用,使用的時候比較流暢,有可能會載入用不上的資源,導致程式初始化時間比較慢。include class single instance...