java之五種單例模式

2021-09-22 18:22:32 字數 2269 閱讀 2376

餓漢模式

dcl(double check lock)雙重校驗鎖

靜態內部類

列舉單例

選擇方式

執行緒安全

效率延遲載入

懶漢模式

安全(方法加鎖)

低(方法加鎖)

能(物件空才例項化)

餓漢模式

安全(初始化載入)

高(無鎖)

不能(類初始化就已經載入)

dcl模式

安全(**塊加鎖)

高(僅第一次加鎖)

能(物件空才例項化)

靜態內部類模式

安全(初始化載入)

高(無鎖)

能(內部類載入才例項化)

列舉模式

安全(jvm保證初始化載入)

高(無鎖)

不能(列舉類載入就完成例項化)

public class singleton01 ;

//靜態方法初始化獲取例項

public static synchronized singleton01 getinstance()

return singleton;

}}

public class singleton01 ;

//靜態方法初始化獲取例項

public static synchronized singleton01 getinstance()

return singleton; }

private static synchronized void singletoninit() }

public static singleton01 getinstance02()

return singleton;

}}

執行緒安全(方法有synchronized),呼叫效率不高(每次進方法都要獲取鎖),但是能實現延遲載入(getinstance中判空才會初始化)

public class singleton02 ;

//靜態方式直接獲取

public static singleton02 getinstance()

}

執行緒安全(類初始化例項物件就會建立),效率高(無鎖),沒有延遲載入(類初始化就建立了)

public class singleton03 ;

//靜態方法獲取例項

public static singleton03 getinstance()

}} return singleton03; }

}

例項物件如果不加volatile會出現不安全,原因:

jvm自動命令重排

執行緒b拿到還未初始化但是有引用的例項物件,導致執行報錯;

加了volatile之後,由於volatile禁止命令重排,上圖中肯定是1,2,3順序執行,則能保證執行緒安全,效率高(只有第一次初始化加鎖),能實現延遲載入(需要的時候才初始化)

public class singleton04 ;

//靜態內部類(主類載入時不會載入靜態內部類)

private static class instance

//靜態方法獲取例項

public static singleton04 getinstance()

}

為什麼要使用靜態內部類?因為靜態內部類可以直接外部類打點呼叫初始化,如果是用普通內部類則需要建立外部類例項,但是這個外部類例項又要由內部類建立,因此使用靜態內部類,那這樣例項物件也得是靜態的;

執行緒安全(只在內部類初始化一次),效率高(無鎖),能實現延遲載入(外部類載入,內部類不會載入,只當使用到getinstance的時候才會載入)

但是其實說它完美,也不一定,如果在建構函式中丟擲異常,例項將永遠得不到建立,也會出錯

public class singleton05 ;

//構建靜態列舉類

private static enum instance

} //靜態方法獲取例項

public static singleton05 getinstance()

}

執行緒安全(jvm保證例項只被初始化一次),效率高(無鎖),不能實現延遲載入(列舉在載入的時候,例項物件就已經被初始化)

單例物件小,不需要延時載入,列舉好於餓漢

單例物件大,需要延時載入,靜態內部類好於懶漢

dcl加volatile在jdk5之前可能仍然有問題,故不建議使用;

五種單例模式

import settings class mysql instance none 原始狀態設為none def init self,ip,port self.ip ip self.port port classmethod deffrom conf cls if cls.instance is n...

五種單例模式

1 餓漢模式 public class ehansingleton 提供獲取單例物件的方法 public static ehansingleton getinstance 2 懶漢式 懶漢式 public class lanhansingleton 提供獲取單例物件的方法 增加 synchroniz...

Java中的五種單例模式

解法一 只適合單執行緒環境 不好 public class singleton public static singleton getinstance return instance 註解 singleton的靜態屬性instance中,只有instance為null的時候才建立乙個例項,建構函式私...