1 /** 2 * 單例模式:保證只有一個實例 private Singleton(){}; 3 * 餓漢式:先建立 private static final Singleton INSTANCE = new Singleton(); 用的時候調用 public static Singleton getInstance(){return INSTANCE;} 4 * 懶漢式:用的時候建立實例。 5 * synchronized在方法內,則主要double-check; 6 * 同步在方法上 public static synchronized Singleton getInstance(){ if(instanceLazy==null) instanceLazy=new Singleton();return instanceLazy;} 7 * 靜態代碼塊: 8 * static{ instanceStaticBlock = new Singleton();} 9 * 靜態內部類: 10 * private static class SingletonHolder{ public static final INSTANCE_STATIC_CLASS=new Singleton();} 11 * 枚舉: 12 * public enum SingletonEnum{INSTANCE;} 13 */ 14 public class Singleton implements Serializable{ 15 private Singleton(){}; // 私有化構造方法,外部沒法建立本類 16 // 餓漢式 17 private static final Singleton INSTANCE = new Singleton(); 18 public static Singleton getInstanceEager(){ return INSTANCE; } 19 // 懶漢式 20 private static volatile Singleton instanceLazy = null; 21 public static Singleton getInstanceLazy1(){ 22 if(instanceLazy == null){ 23 synchronized(Singleton.class){ 24 if(instanceLazy == null){ 25 instanceLazy = new Singleton(); 26 } 27 } 28 } 29 return instanceLazy; 30 } 31 public static synchronized Singleton getInstanceLazy2(){ 32 if(instanceLazy == null){ 33 instanceLazy = new Singleton(); 34 } 35 return instanceLazy; 36 } 37 // 靜態代碼塊 38 private static Singleton instanceStaticBlock = null; 39 static{ 40 instanceStaticBlock = new Singleton(); 41 } 42 public static Singleton getInstanceStaticBlock(){ return instanceStaticBlock; } 43 // 靜態內部類 44 private static class SingletonHolder{ public static final Singleton INSTANCE = new Singleton(); } 45 public static Singleton getInstanceStaticClass(){ return SingletonHolder.INSTANCE; } 46 47 // 磚家建議:功能完善,性能更佳,不存在序列化等問題的單例 就是 靜態內部類 + 以下的代碼 48 private static final long serialVersionUID = 1L; 49 protected Object readResolve(){ return getInstanceStaticClass(); } 50 } 51 //枚舉 52 enum SingletonEnum{ 53 INSTANCE; 54 }