餓漢模式
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的時候才建立乙個例項,建構函式私...