標籤:
首先這兩種方式都是延遲初始化機制,就是當要用到的時候再去初始化。
但是Effective Java書中說過:除非絕對必要,否則就不要這麼做。
1. DCL (double checked locking)雙重檢查:
如果出於效能的考慮而需要對執行個體域(注意這個屬性並沒有被static修飾)使用延遲初始化,就使用雙重檢查模式
public class Singleton { private volatile Singleton uniqueInstance; private Singleton(){ } public static Singleton getInstance(){ if(uniqueInstance == null){ //#1 synchronized(Singleton.class){ //#2 if(uniqueInstance == null){ //#3 uniqueInstance = new Singleton(); //#4 System.out.println(Thread.currentThread().getName() + ": uniqueInstance is initalized..."); //#5.1 } else { System.out.println(Thread.currentThread().getName() + ": uniqueInstance is not null now..."); //#5.2 } } } return uniqueInstance; }}
2. lazy initialization holder class(靜態內部類):
如果出於效能的考慮而需要對靜態域(注意這個屬性被static修飾)使用延遲初始化,就使用lazy initialization holder class模式。
1 public class Singleton { 2 3 private static class SingletonHolder { 4 /** 5 * 靜態初始化器,由JVM來保證安全執行緒 6 */ 7 private static Singleton instance = new Singleton(); 8 } 9 10 private Singleton(){11 }12 13 public static Singleton getInstance(){14 return SingletonHolder.instance;15 }16 }
最後,以上兩種方法都不是實現單例模式的最好方式,最好的是枚舉模式,coming soon...
單例模式的兩種實現方式對比:DCL (double check idiom)雙重檢查 和 lazy initialization holder class(靜態內部類)