一、如何破环单例模式

破环单例模式很简单,使单例类创建多个对象即可,枚举方式除外

二、破坏单例模式的方式

常见的破环单例模式的方式就是序列化反序列化和反射

示例在:单例模式详解_crazyK.的博客-CSDN博客

1.序列化反序列化

以静态内部类创建单例模式为例

public class DestroySingleton {public static void main(String[] args) throws IOException, ClassNotFoundException {//writeObjectFile();readObjectFile();//两次获取到的不是同一个对象,说明单例创建了多个对象,单例模式破坏成功readObjectFile();}//向文件中写数据(对象)public static void readObjectFile() throws IOException, ClassNotFoundException {//创建对象输入流对象ObjectInputStream ois = new ObjectInputStream(new FileInputStream("C:\\Users\\apple\\Desktop\\a.txt"));//读取对象LazyMan4 instance = (LazyMan4) ois.readObject();System.out.println(instance);//释放资源ois.close();}//从文件中读数据(对象)public static void writeObjectFile() throws IOException {//获取单例对象LazyMan4 instance = LazyMan4.getInstance();//创建对象输出流对象ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("C:\\Users\\apple\\Desktop\\a.txt"));//写对象oos.writeObject(instance);//释放资源oos.close();}
}

writeObjectFile()方法会将对象创建出一个.txt文件,在调用readObjectFile()方法读取文件对象时,可以看到两个对象不相同,说明单例模式已被破坏

2.反射

以静态内部类创建的单例为例

public class DestroySingleton2 {public static void main(String[] args) throws Exception {//获取单例类的字节码对象Class clazz = LazyMan4.class;//获取无参构造方法对象Constructor cons =clazz.getDeclaredConstructor();//暴力反射cons.setAccessible(true);//创建对象LazyMan4 l1 =(LazyMan4) cons.newInstance();LazyMan4 l2 =(LazyMan4) cons.newInstance();//false 两个对象地址不同,说明单例创建了对各对象,单例模式破坏成功System.out.println(l1 == l2);}
}

三、解决方案

1.序列化反序列化

在单例类中添加readResolve()方法,在反序列化时被反射调用,如果定义了这个方法,就返回这个方法的值,如果没有定义,则返回新new出来的对象

public class LazyMan implements Serializable {private LazyMan(){}//定义一个静态内部类private static class LazyManHolder{private static final LazyMan INSYANCE = new LazyMan();}//对外访问方法public static LazyMan getInstance(){return LazyMan.LazyManHolder.INSYANCE;}//防止被破坏//当进行反序列化时,会自动调用该方法,将该方法的返回值直接反回public Object readResolve(){return LazyManHolder.INSYANCE;}
}

2.反射

在构造方法中加同步块

class LazyMan3{private static boolean flag = false;private LazyMan3() {synchronized (LazyMan3.class) {//判断flag的值是否为true,如果是true,说明非第一次访问,直接抛出一个异常//如果为false,说明是第一次访问if (flag) {throw new RuntimeException("不能创建多个对象");}//将flag设置为trueflag = true;}}//定义一个静态内部类private static class LazyMan3Holder{private static final LazyMan3 INSYANCE = new LazyMan3();}//对外访问方法public static LazyMan3 getInstance(){return LazyMan3.LazyMan3Holder.INSYANCE;}
}

破环单例模式及解决方案相关推荐

  1. 单链表-两个线性表的合并1(破环原链表+尾插法)

    题意: 令L1 = (X1,X2,X3,X4-Xn), L2 = (y1,y2,y3,y4-ym);是两个线性表.采用带头节点的链表存储,设计一个算法合并L1,L2,结果放在线性表L3中,要求如下: ...

  2. 1342. 断开的项链【难度: 一般 / 破环成链】

    https://www.acwing.com/problem/content/description/1344/ 破环成链,对于是白色的我们直接加,对于其它颜色的我们加,然后加入哈希表. 如果某个时刻 ...

  3. 中兴力维动环监控接线图_中兴力维传统动环监控系统解决方案

    中兴力维传统动环监控系统解决方案 2018-09-16 1.方案介绍 随着现代通信事业的迅猛发展和移动通信与本地网有线通信的体制分离,通信运营商建设了大量的通信基站和机房,通信运营商都面临运维力量薄弱 ...

  4. 中兴力维动环监控_中兴力维传统动环监控系统解决方案

    1.方案介绍 随着现代通信事业的迅猛发展和移动通信与本地网有线通信的体制分离,通信运营商建设了大量的通信基站和机房,通信运营商都面临运维力量薄弱和运维工作量大的矛盾,通信基站和机房一般具有如下特点:局 ...

  5. 泰斗破环神学习笔记——主界面开发

    泰斗破环神学习笔记--主界面开发 主界面主要就是,角色状态面板.角色信息面板.金币与钻石数额面板 文章目录 泰斗破环神学习笔记--主界面开发 前言 一.委托(delegate) 二.事件(Event) ...

  6. 竣达技术丨中小型机房动环网络监控主机解决方案

    一.概述: 在现代的环境安全中,机房状态安全的重要性对于各类场所是不言而喻.传统大型机房的监控方案有着庞大的系统和复杂的实施工作,对于中小型的机房来说存在着不少冗余的内容,有鉴于此,我们推出了动环网络 ...

  7. 智能驾驶整车在环实验室SYNO解决方案

    概述 随着汽车行业智能化.网联化的发展趋势,对智能网联车辆的测试验证手段提出了更高的要求.当前智能网联车辆的测试手段依赖单部件.单系统的测试,一方面测试周期长,人力.设备投入成本高:另一方面缺乏整车环 ...

  8. 商务酒店机房改造环控项目解决方案

    一.方案背景: 广州某商务酒店机房运维人员通过网络联系到我们,现工程需要对机房的UPS.精密空调等设备的运行状况进行集中监控,并且也要对机房的温湿度.漏水.烟感等进行集中监控管理.并对机房出入门部分, ...

  9. 1046 Shortest Distance (20 分)【难度: 简单 / 知识点: 前缀和 / 破环成链】

    https://pintia.cn/problem-sets/994805342720868352/problems/994805435700199424 对于环这种情况,开两倍的数组即可. #inc ...

  10. 判断设备网络状态_生成树RSTP,快速生成树协议,交换网络必用的破环协议,面试必备...

    一.RSTP 802.1w 标准定义了快速生成树协议 RSTP(Rapid Spanning Tree Protocol),该协议基于 STP 协议,对原有的 STP 协议进行了改进并实现了快速收敛. ...

最新文章

  1. 小猿圈Python之实现京东秒杀功能代码
  2. MyEclipse连接oracle9i:invalid or unknown NLS parameter value specified错误
  3. 深入理解Redis的持久化机制和原理
  4. hiho_1089_floyd最短路
  5. 同时存多个变量缓存 微信小程序_微信小程序 缓存(本地缓存、异步缓存、同步缓存)详解...
  6. 服务器操作系统文件共享设置,服务器操作系统文件共享设置
  7. Python【算法中心 02】Web框架Django管理页面使用(管理员账号创建+API使用+应用添加)GreenPlum数据库引擎及API测试
  8. scala (2) while 和变量
  9. mouseover与mouseenter、 mouseout与mouseleave的区别
  10. u9系统的使用方法仓库_用友ERP系统,U9操作流程图
  11. 程序员软件工程常用的画图软件推荐
  12. 7、STC12C5A60S2核心芯片说明文档
  13. 平行束滤波fbp_CT平行束和扇形束算法的转换.pptx
  14. 软件开发中什么是CI/CD
  15. [二] X 名称空间
  16. ELK继续分析V2EX(我自己搬运我自己)
  17. ElasticSearch - 简介
  18. 三十天学会绘画pdf_三十天学会实用画法
  19. Windows平台最佳免费音频和视频软件
  20. RL-D1电流继电器

热门文章

  1. error C2011: “CMemDC”:“class”类型重定义
  2. python的文件包括_Python 文件操作
  3. 日本:加密行业贸易组织JCBA发布ICO监管方针
  4. ubuntu进行配置Android 的NDK环境
  5. python selenium 验证码识别_「验证码识别」selenium-识别验证码 - seo实验室
  6. 阿里云配置mysql数据库
  7. JwtToken使用-重点看一下过期时间
  8. APP隐私合规_个人信息保护合规评估工具
  9. pts/chess测试
  10. image_caption论文及数据集