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 }