枚举(JDK1.5)类自带单例模式

饿汉模式

  • 初始化时立即加载对象。
  • 线程安全

    懒汉模式

  • 初始化不加载,真正需要的时候加载。懒加载。

    静态内部类实现单例

  • 结合了懒汉饿汉各自优点,需要时加载,加载线程安全。 ```java public class Ss{ private Ss(){ sout(“构造函数初始化”); }

    public static class Inn(){

    1. private static final Ss SS = new Ss();

    }

    public static Ss getInstance(){

    1. return Inn.SS;

    }

}

  1. <a name="VzQeQ"></a>
  2. ### DCL双重检测锁懒汉模式
  3. ```java
  4. public class Lazy{
  5. private Lazy(){
  6. }
  7. private volatile static Lazy lazy;//volatile防止指令重排
  8. public static Lazy getInstance(){
  9. if(lazy == null){
  10. synchronized(Lazy.class){
  11. if(lazy == null){
  12. lazy = new lazy();//不是一个原子操作,又可能指令重排
  13. }
  14. }
  15. }
  16. return lazy;
  17. }
  18. }

反射破坏单例

  • DCL反射可破坏

    • 解决:构造方法加锁,抛异常。
    • 都通过反射继续破坏。
    • 解决:红绿灯,抛异常。
    • 反射修改信号值…
    • 枚举防反射

      枚举实现单例

  • 简单高效,枚举本身就是单例JVM保障,避免反射和反序列化漏洞,缺点是没有延迟加载。 ```java public enum EnumSin{ INSTANCE;

    public void doxx(){

    1. sout"XXX"

    } }

public class main{ public static void main(String[] args){ EnumSin.INSTANCE.doxx(); } } ```

枚举防止反射

  • Enumxx.class.getDeclaredConstructor().newInstance();

image.png

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

image.png

枚举