多執行緒 單例模式的實現

2021-09-24 15:02:25 字數 1491 閱讀 5006

單例模式:

餓漢式:

public class myobject 

public static myobject getinstance()

}

懶漢式:

public class myobject 

public static myobject getinstance()

return obj;

}}

懶漢式的**如果寫成上面這樣,在多執行緒環境中是錯誤的,是不能實現單例的。

解決:1)、 對getinstance()宣告synchronized

2)、 在getinstance()方法中使用同步**塊

3)、 使用dcl雙檢查鎖機制

分析 1、2性質相同,效率低

dcl雙檢查鎖分析:

public class myobject 

public static myobject getinstance()}}

return obj;

}}

描述:

除第一次建立物件外,其他的執行緒在訪問到第乙個if時,就返回了,不會進入同步**塊,效率提高了。

dcl存在的問題:

由於obj = new myobject();並非原子性操作[即該語句要麼執行完成,要麼沒有執行過],而jvm在執行該語句時,是分了三步執行的:

1)、為obj例項分配記憶體

2)、初始化myobject的構造器

3)、將myobject物件指向為obj分配的記憶體空間,【注:此時obj已經非null】

jvm編譯器是允許處理器亂序執行的,所以執行順序可能是 1-2-3或1-3-2。如果是1-3-2,在步驟3執行完成而步驟2還未執行的時候,被切換到了執行緒b上,由於執行緒a已經執行完了步驟3,所以obj是非null。導致執行緒b不再去例項化obj,直接拿著obj去使用,導致報錯。(因為obj未完成初始化)

那麼如何避免這樣的問題呢?

可以使用volatile關鍵字,將變數宣告為:

private volatile static myobject obj = null;

最後,介紹乙個相對完美的解決方案---使用靜態內部類實現單例模式

public class myobject 

private static class myobjecthandler

public static myobject getinstance()

}

建立物件的過程交給了jvm,因此可以保證執行緒的安全;

myobjecthandler是私有的,只有通過getinstance()訪問,進而保證了延遲載入特性

獲取例項時,也避免了使用同步,進而提公升了效能

c 多執行緒單例模式 C 單例模式實現

單例模式,可以說設計模式中最常應用的一種模式了。但是如果沒有學過設計模式的人,可能不會想到要去應用單例模式,面對單例模式適用的情況,可能會優先考慮使用全域性或者靜態變數的方式,這樣比較簡單,也是沒學過設計模式的人所能想到的最簡單的方式了。一般情況下,我們建立的一些類是屬於工具性質的,基本不用儲存太多...

多執行緒 單例模式

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

單例模式多執行緒

單例模式 確保某個類只有乙個例項化物件 import time class a from threading import lock instance none lock lock def new cls,args,kwargs 加鎖確保時間片不發生輪轉 with cls.lock ifnot cl...