單例模式:
餓漢式:
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...