單例模式又分爲餓漢式,懶漢式,靜態內部類式,枚舉式,雙重檢測鎖式(由於JVM的底層內部模型願意,偶爾會報錯,所以不推薦使用)
下面我們來看一下餓漢式單例模式:
public class SingletonDemo01 {
private static SingletonDemo01 singleton=new SingletonDemo01();
private SingletonDemo01(){
}
//因爲加載類時是天然的線程安全的,所以不用加同步塊
public static SingletonDemo01 getInstance(){
return singleton;
}
}
懶漢式單例模式:public class SingletonDemo01 {
private static SingletonDemo01 singleton;
private SingletonDemo01(){
}
//加同步塊,防止不同步造成加載多個對象,這樣就沒有單例的實際意義,也可能會造成錯誤
public static synchronized SingletonDemo01 getInstance(){
if(singleton == null){
singleton = new SingletonDemo01();
}
return singleton;
}
}
靜態內部類式單例模式public class SingletonDemo01 {
//靜態的內部類,實現的對象的創建
private static class SingletonDemoInstance{
//此處的final可加可不加
private static final SingletonDemo01 singleton=new SingletonDemo01();
}
private SingletonDemo01(){}
public static SingletonDemo01 getInstance(){
return SingletonDemoInstance.singleton;
}
}
PS: 1、外部類有static 屬性,則不會像創建餓漢式那樣立即加載對象了,只有真正的調用到getInstance()纔會加載靜態內部類,加載時候是線程安全的,instance是static final
類型的,保證了內存中只有一個這樣的實例存在,而且只能被賦值一次,從而保證的線程的安全
2、兼備了併發高效調用和延遲加載的優勢。