枚举(JDK1.5)类自带单例模式
饿汉模式
- 初始化时立即加载对象。
-
懒汉模式
-
静态内部类实现单例
结合了懒汉饿汉各自优点,需要时加载,加载线程安全。 ```java public class Ss{ private Ss(){ sout(“构造函数初始化”); }
public static class Inn(){
private static final Ss SS = new Ss();
}
public static Ss getInstance(){
return Inn.SS;
}
}
<a name="VzQeQ"></a>### DCL双重检测锁懒汉模式```javapublic class Lazy{private Lazy(){}private volatile static Lazy lazy;//volatile防止指令重排public static Lazy getInstance(){if(lazy == null){synchronized(Lazy.class){if(lazy == null){lazy = new lazy();//不是一个原子操作,又可能指令重排}}}return lazy;}}
反射破坏单例
DCL反射可破坏
简单高效,枚举本身就是单例JVM保障,避免反射和反序列化漏洞,缺点是没有延迟加载。 ```java public enum EnumSin{ INSTANCE;
public void doxx(){
sout"XXX"
} }
public class main{ public static void main(String[] args){ EnumSin.INSTANCE.doxx(); } } ```
枚举防止反射
- Enumxx.class.getDeclaredConstructor().newInstance();

- 字节码显示枚举无参构造,实际是有参构造
