单例模式注意点

一、静态内部类的实现

当调用getInstance时,内部类被实例化,由于类变量被static修饰,导致变量成为类变量,为类所共有(只存在一个),保证了线程安全

public class StaticSingle {
    private  static  class SingleClassLoader{
        public static StaticSingle single=new StaticSingle();
    }

    public static  StaticSingle getInstance(){
        return SingleClassLoader.single;
    }
}

这样写会存在一定的问题,存在什么问题呢?

  • 使用反射机制将构造函数改为public就会破坏单例
  • 序列化会破坏单例,因为在反序列的过程中jvm会自动调用readResolve来通过反射获取一个新的实例,这样就破坏的单例

解决办法:
逻辑判断是否被实例,实例了就要抛出异常终止创建过程

  private static boolean instance=false;
    private  StaticSingle(){
           synchronized (StaticSingle.class){
               if(instance==false){
                   instance=true;
               }else{
                   throw  new RuntimeException("error");
               }
           }
    }

重写readResolve方法

public Object readResolve(){
        return SingleClassLoader.single;
 }

猜你喜欢

转载自blog.csdn.net/visionEH/article/details/80722900