枚举(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双重检测锁懒汉模式
```java
public 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();
- 字节码显示枚举无参构造,实际是有参构造