枚举类单例

Joshua Bloch的《effective java》书中提到:单元素的枚举类型已经成为实现Singleton的最佳方法。

双重检查加锁方式

public class Singleton {
     private volatile static Singleton uniqueInstance;
     private Singleton() {}
     public static Singleton getInstance() {
         if (uniqueInstance == null) {
             synchronized (Singleton.class){
                 if(uniqueInstance == null){//进入区域后,再检查一次,如果仍是null,才创建实例
                     uniqueInstance = new Singleton();
                 }
             }
         }
         return uniqueInstance;
     }
}

 

私有化构造器并不保险

享有特权的客户端可以借助AccessibleObject.setAccessible方法,通过反射机制调用私有构造器。如果需要低于这种攻击,可以修改构造器,让它在被要求创建第二个实例的时候抛出异常。

 

直接使用枚举单例

public enum  EnumSingleton {
    INSTANCE;
    public EnumSingleton getInstance() {
        return INSTANCE;
    }

    public static void main(String[] args) throws NoSuchMethodException, Exception {
        EnumSingleton e1 = EnumSingleton.INSTANCE;
        EnumSingleton e2 = EnumSingleton.INSTANCE;
        System.out.println("e1与e2是否相等" + (e1 == e2));
Constructor
<EnumSingleton> constructor = EnumSingleton.class.getDeclaredConstructor(); constructor.setAccessible(true); EnumSingleton e3 = constructor.newInstance(); System.out.println("e1与e3是否相等" + (e1 == e3)); } }

 

链接地址:

https://www.cnblogs.com/chiclee/p/9097772.html

posted @ 2019-01-22 14:25  变化中寻找不变  阅读(389)  评论(0)    收藏  举报