//餓漢式實現單例模式
public class hungry
private static hungry hungry = new hungry();
public static hungry gethungry()
}
優點:實現簡單,類載入的時候就完成了例項化,避免了執行緒的同步問題
缺點:無法實現延遲載入,可能會造成記憶體的浪費(浪費可忽略)
//懶漢式實現單例模式
public class lazysingleton01
private static lazysingleton01 lazy ;
public static lazysingleton01 getlazy()
return lazy;}}
//懶漢式+同步方法實現單例模式
public class lazysingleton02
private static lazysingleton02 lazy;
public static synchronized lazysingleton02 getlazy()
return lazy;}}
執行緒安全,效率低不推薦使用
對於上述缺陷的改進可能有的人會想到如下的**:
public class lazysingleton03
private static lazysingleton03 lazy;
public static lazysingleton03 getlazy()
}return lazy;}}
該寫法一樣是執行緒不安全的,當乙個執行緒還沒有例項化lazysingleton03時,另乙個執行緒執行到if(lazy==null)這個判斷語句時就會進入if語句,雖然加了鎖,但是等到第乙個執行緒執行完lazy=new lazysingleton03()釋放出這個鎖時,另乙個進入if語句的執行緒同樣會例項化另外乙個lazysingleton03物件。
經過一步步的探索,有了雙重校驗鎖的懶漢式寫法:
//雙重校驗鎖+懶漢式
public class doublechecksingleton
private volatile static doublechecksingleton instance;
public static doublechecksingleton getinstance()}}
return instance;}}
優點:執行緒安全,延遲載入,效率較高
注意此處的volatile:
//雙重校驗鎖+懶漢式
public class doublechecksingleton
private volatile static doublechecksingleton instance;
public static doublechecksingleton getinstance()}}
return instance;}}
解決這個方法很簡單,加乙個關鍵字volatite這個關鍵字能夠保證例項化的順序的相對位置不變,instance例項化永遠在socket之後
//靜態內部類實現單例模式
public class staticinner
private static class inner
public static staticinner getinstance()
}
優點:避免了執行緒不安全,延遲載入,效率高
詳解:這個方法並沒有事先宣告instance的靜態成員,而是把它放到了靜態內部類inner中,inner中定義了靜態變數,並直接進行了例項化,當inner被主動引用的時候就會建立例項,staticinner在例項建立過程中被收集到()方法中,這個方法是同步方法,
保證了記憶體的可見性,jvm指令的順序執行和原子性。該方法也是單例模式的最好設計之一。
//列舉實現單例模式
public enum enumsingleton
public void method(){}
}
借助jdk1.5中新增的列舉來實現單例模式優點:不僅能避免多執行緒同步問題,而且還能防止反序列化重新建立新的物件,實現非常簡單而且最安全可謂很完美。 單例模式 雙重校驗鎖
單例模式 雙重校驗鎖 author szekinwin public class singleton3 私有化構造方法 private static volatile singleton3 singleton null public static singleton3 getinstance ret...
雙重校驗鎖實現單例模式
1 先上 public class singleton public static singleton getinstance return instance 2 分析 第一次校驗 instance null 單例模式只需要建立乙個例項,假如例項不為空則不需要去競爭鎖,提高效能 第二次校驗 inst...
單例雙重校驗鎖
public class singledoublelock 1 第一次校驗 因為該類是單例的只建立一次,大部分時間single都不為空,所以不會進行第一次檢驗的 塊內部,從而提高效率 2 第二次校驗 如果single為空,執行緒t1,t2進入第一次檢驗的 塊,t1執行synchronized 塊 n...