Java-單例模式的幾種寫法
阿新 • • 發佈:2019-02-01
一,懶漢式
優點:執行緒安全
缺點:類載入時就初始化了,沒有實現懶載入。
public class SingleTonFirst { private static SingleTonFirst singleTonFirst = new SingleTonFirst(); private SingleTonFirst() { } public static SingleTonFirst getInstance() {return singleTonFirst; } }二,餓漢式(執行緒不安全的形式)
優點:懶載入
缺點:執行緒不安全
public class SingleTonSecond { private staticSingleTonSecond singleTonSecond; private SingleTonSecond() { } public static SingleTonSecond getInstance() { if (null == singleTonSecond) { singleTonSecond = new SingleTonSecond(); } return singleTonSecond; } }
三,懶漢式(執行緒安全之同步方法)
優點:執行緒安全,懶載入
缺點:每次獲取單例都要鎖定整個方法,效能較差
public class SingleTonThird { private static SingleTonThird singleTonThird; private SingleTonThird(){ } public synchronized static SingleTonThird getInstance(){ if(null==singleTonThird){ singleTonThird=new SingleTonThird(); } return singleTonThird; } }
四,懶漢式(執行緒安全之同步程式碼塊)------推薦
優點:執行緒安全,只在第一次獲取單例時鎖定了單例物件。
推薦!!!!!!!!!
public class SingleTonFourth { private volatile static SingleTonFourth singleTonFourth; private SingleTonFourth(){ } public static SingleTonFourth getInstance(){ if(null==singleTonFourth){ synchronized (singleTonFourth){ if (null==singleTonFourth){ singleTonFourth=new SingleTonFourth(); } } } return singleTonFourth; } }
五,靜態內部類方式-----------推薦!!!!!!!!
優點:執行緒安全,懶載入,效率高靜態內部類的凡是在單例類在被JVM載入到記憶體時並不會立即例項化,而是在第一次呼叫
的getInstance()方法時才會將SingleTonFifthInner類載入到記憶體,從而例項化SingleTonFifthInner的靜態屬性
SINGLETON,才開始載入例項化SINGLETON。並且在例項化SINGLETON的時候,JVM幫助我們保證了執行緒的安全性。
public class SingleTonFifth { private SingleTonFifth() { } public static SingleTonFifth getInstance() { return SingleTonFifthInner.SINGLETON; } private static class SingleTonFifthInner { private static final SingleTonFifth SINGLETON = new SingleTonFifth(); } }
六,列舉型別實現單例模式
public class SingleTonSixth { private SingleTonSixth(){ } public static SingleTonSixth getInstance(){ return SingleTonEnum.ISNTANCE.getInstancee(); } private static enum SingleTonEnum{ ISNTANCE; private SingleTonSixth singleTonSixth; private SingleTonEnum(){ singleTonSixth=new SingleTonSixth(); } private SingleTonSixth getInstancee(){ return singleTonSixth; } } }