• effectivejava(破坏单例)


    以下代码是最普通的双重锁的单例实现形式

    package com.edu.character02;
    
    import java.io.Serializable;
    
    /**
     * <p>
     * 双重锁
     * </P>
     *
     * @作者 five-five
     * @创建时间 2020/8/5
     */
    public class SingleTon implements Serializable {
        private static SingleTon instance;
    
        public static SingleTon getInstance() {
            if (instance == null) {
                synchronized (SingleTon.class) {
                    if (instance == null) {
                        instance = new SingleTon();
                    }
                }
            }
            return instance;
        }
    
        private SingleTon() {
        }
    }

    下面是两种破坏单例的方案

    1.通过反射的形式

    package com.edu.character02;
    
    import java.lang.reflect.Constructor;
    
    /**
     * <p>
     * 反射破坏单例
     * </p>
     *
     * @作者 five-five
     * @创建时间 2020/8/5
     */
    public class DamageSingleTonByReflect {
        public static void main(String[] args) throws Exception {
            SingleTon s1 = SingleTon.getInstance();
            Class<? extends SingleTon> aClass = s1.getClass();
            Constructor<? extends SingleTon> constructor = aClass.getDeclaredConstructor();
            constructor.setAccessible(true);
            SingleTon singleTon = constructor.newInstance();
            System.out.println(s1);
            System.out.println(singleTon);
            System.out.println(s1.hashCode());
            System.out.println(singleTon.hashCode());
            System.out.println(singleTon == s1);
        }
    }

    测试结果如图:

    2.通过序列化的形式

    package com.edu.character02;
    
    import com.sun.xml.internal.ws.policy.privateutil.PolicyUtils;
    
    import java.io.*;
    
    /**
     * <p>
     *     破坏单例
     * </p>
     * @作者 five-five
     * @创建时间 2020/8/5
     */
    public class DamageSingleTonBySerializable {
        public static void main(String[] args) {
            SingleTon s1=null;
            SingleTon s2=SingleTon.getInstance();
            FileOutputStream fos=null;
            ObjectOutputStream oos=null;
            FileInputStream fis=null;
            ObjectInputStream ois=null;
            try {
                fos=new FileOutputStream("SingleTon.obj");
                oos=new ObjectOutputStream(fos);
                oos.writeObject(s2);
                oos.flush();
                oos.close();
    
                fis=new FileInputStream("SingleTon.obj");
                ois = new ObjectInputStream(fis);
                s1= (SingleTon) ois.readObject();
                ois.close();
    
                System.out.println(s1);
                System.out.println(s2);
                System.out.println(s1.hashCode());
                System.out.println(s2.hashCode());
                System.out.println(s1==s2);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    测试结果如图:

  • 相关阅读:
    测试精进之路
    访问Apache服务器自动跳转到https协议
    如何安装Chrome OS系统
    遇到Project Target Framework Not Installed解决方法
    2019开发者调查结果和总结
    「工具神器」推荐一个扒网页的神器
    Linux 使用Unzip提示write error (disk full?). Continue? (y/n/^C)的解决方法
    安卓编译Failed to authenticate Jack server certificate错误问题解决办法
    如何手动给APK文件签名
    如何给个人网站添加免费的SSL
  • 原文地址:https://www.cnblogs.com/five-five/p/13437821.html
Copyright © 2020-2023  润新知