单例模式160905
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 }