电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

JAVA破壞單例模式的方式以及避免方法

瀏覽:6日期:2022-08-31 08:51:36

單例模式,大家恐怕再熟悉不過了,其作用與實現方式有多種,這里就不??鋁恕5?牽?勖竊謔褂謎廡┓絞絞迪值ダ?J絞保?絳蛑芯駝嫻幕嶂揮幸桓鍪道?穡?/p>

聰明的你看到這樣的問話,一定猜到了答案是NO。這里筆者就不賣關子了,開門見山吧!實際上,在有些場景下,如果程序處理不當,會無情地破壞掉單例模式,導致程序中出現多個實例對象。

下面筆者介紹筆者已知的三種破壞單例模式的方式以及避免方法。

1、反射對單例模式的破壞

我們先通過一個例子,來直觀感受一下

(1)案例

DCL實現的單例模式:

public class Singleton{ private static volatile Singleton mInstance; private Singleton(){} public static Singleton getInstance(){ if(mInstance == null){ synchronized (Singleton.class) {if(mInstance == null){ mInstance = new Singleton();} } } return mInstance; }}

測試代碼:

public class SingletonDemo { public static void main(String[] args){ Singleton singleton = Singleton.getInstance(); try { Constructor<Singleton> constructor = Singleton.class.getDeclaredConstructor(); constructor.setAccessible(true); Singleton reflectSingleton = constructor.newInstance(); System.out.println(reflectSingleton == singleton); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } }}

執行結果:

false

運行結果說明,采用反射的方式另辟蹊徑實例了該類,導致程序中會存在不止一個實例。

(2)解決方案

其思想就是采用一個全局變量,來標記是否已經實例化過了,如果已經實例化過了,第二次實例化的時候,拋出異常。實現代碼如下:

public class Singleton{ private static volatile Singleton mInstance; private static volatile boolean mIsInstantiated = false; private Singleton(){ if (mIsInstantiated){ throw new RuntimeException('Has been instantiated, can not do it again!'); } mIsInstantiated = true; } public static Singleton getInstance(){ if(mInstance == null){ synchronized (Singleton.class) {if(mInstance == null){ mInstance = new Singleton();} } } return mInstance; }}

執行結果:

JAVA破壞單例模式的方式以及避免方法

2、clone()對單例模式的破壞

當需要實現單例的類允許clone()時,如果處理不當,也會導致程序中出現不止一個實例。

(1)案例

一個實現了Cloneable接口單例類:

public class Singleton implements Cloneable{ private static volatile Singleton mInstance; private Singleton(){ } public static Singleton getInstance(){ if(mInstance == null){ synchronized (Singleton.class) {if(mInstance == null){ mInstance = new Singleton();} } } return mInstance; } @Override protected Object clone() throws CloneNotSupportedException { // TODO Auto-generated method stub return super.clone(); }}

測試代碼:

public class SingletonDemo { public static void main(String[] args){ try { Singleton singleton = Singleton.getInstance(); Singleton cloneSingleton; cloneSingleton = (Singleton) Singleton.getInstance().clone(); System.out.println(cloneSingleton == singleton); } catch (CloneNotSupportedException e) { e.printStackTrace(); } }}

執行結果:

false

(2)解決方案:

解決思想是,重寫clone()方法,調clone()時直接返回已經實例的對象

public class Singleton implements Cloneable{ private static volatile Singleton mInstance; private Singleton(){ } public static Singleton getInstance(){ if(mInstance == null){ synchronized (Singleton.class) {if(mInstance == null){ mInstance = new Singleton();} } } return mInstance; } @Override protected Object clone() throws CloneNotSupportedException { return mInstance; }}

執行結果:

true

3、序列化對單例模式的破壞

在使用序列化/反序列化時,也會出現產生新實例對象的情況。

(1)案例

一個實現了序列化接口的單例類:

public class Singleton implements Serializable{ private static volatile Singleton mInstance; private Singleton(){ } public static Singleton getInstance(){ if(mInstance == null){ synchronized (Singleton.class) {if(mInstance == null){ mInstance = new Singleton();} } } return mInstance; }}

測試代碼:

public class SingletonDemo { public static void main(String[] args){ try { Singleton singleton = Singleton.getInstance(); FileOutputStream fos = new FileOutputStream('singleton.txt'); ObjectOutputStream oos = new ObjectOutputStream(fos); oos.writeObject(singleton); oos.close(); fos.close(); FileInputStream fis = new FileInputStream('singleton.txt'); ObjectInputStream ois = new ObjectInputStream(fis); Singleton serializedSingleton = (Singleton) ois.readObject(); fis.close(); ois.close(); System.out.println(serializedSingleton==singleton); } catch (Exception e) { e.printStackTrace(); } }}

運行結果:

false

(2)解決方案

在反序列化時的回調方法 readResolve()中返回單例對象。

public class Singleton implements Serializable{ private static volatile Singleton mInstance; private Singleton(){ } public static Singleton getInstance(){ if(mInstance == null){ synchronized (Singleton.class) {if(mInstance == null){ mInstance = new Singleton();} } } return mInstance; } protected Object readResolve() throws ObjectStreamException{ return mInstance; }}

結果:

true

以上就是筆者目前已知的三種可以破壞單例模式的場景以及對應的解決辦法,讀者如果知道還有其他的場景,記得一定要分享出來噢,正所謂“獨樂樂不如眾樂樂”!!!

單例模式看起來是設計模式中最簡單的一個,但“麻雀雖小,五臟俱全”,其中有很多細節都是值得深究的。即便是本篇介紹的這幾個場景,也只是介紹了一些梗概而已,很多細節還需要讀者自己去試驗和推敲的,比如:通過枚舉方式實現單例模式,就不存在上述問題,而其它的實現方式似乎都存在上述問題!

后記

本篇參(剽)考(竊)了如下資料:https://www.jb51.net/article/143047.htm

以上就是JAVA破壞單例模式的方式以及避免方法的詳細內容,更多關于JAVA 單例模式的資料請關注好吧啦網其它相關文章!

標簽: Java
相關文章:
主站蜘蛛池模板: 全自动面膜机_面膜折叠机价格_面膜灌装机定制_高速折棉机厂家-深圳市益豪科技有限公司 | 意大利Frascold/富士豪压缩机_富士豪半封闭压缩机_富士豪活塞压缩机_富士豪螺杆压缩机 | 美国查特CHART MVE液氮罐_查特杜瓦瓶_制造全球品质液氮罐 | 流程管理|流程管理软件|企业流程管理|微宏科技-AlphaFlow_流程管理系统软件服务商 | 精益专家 - 设备管理软件|HSE管理系统|设备管理系统|EHS安全管理系统 | 水厂污泥地磅|污泥处理地磅厂家|地磅无人值守称重系统升级改造|地磅自动称重系统维修-河南成辉电子科技有限公司 | 厦门网站建设_厦门网站设计_小程序开发_网站制作公司【麦格科技】 | 广东高华家具-公寓床|学生宿舍双层铁床厂家【质保十年】 | 气力输送设备_料封泵_仓泵_散装机_气化板_压力释放阀-河南锐驰机械设备有限公司 | POM塑料_PBT材料「进口」聚甲醛POM杜邦原料、加纤PBT塑料报价格找利隆塑料 | 加中寰球移民官网-美国移民公司,移民机构,移民中介,移民咨询,投资移民 | 微信聊天记录恢复_手机短信删除怎么恢复_通讯录恢复软件下载-快易数据恢复 | 烟气在线监测系统_烟气在线监测仪_扬尘检测仪_空气质量监测站「山东风途物联网」 | 道达尔润滑油-食品级润滑油-道达尔导热油-合成导热油,深圳道达尔代理商合-深圳浩方正大官网 | LZ-373测厚仪-华瑞VOC气体检测仪-个人有毒气体检测仪-厂家-深圳市深博瑞仪器仪表有限公司 | 蓝牙音频分析仪-多功能-四通道-八通道音频分析仪-东莞市奥普新音频技术有限公司 | 珠光砂保温板-一体化保温板-有釉面发泡陶瓷保温板-杭州一体化建筑材料 | 避光流动池-带盖荧光比色皿-生化流动比色皿-宜兴市晶科光学仪器 东莞爱加真空科技有限公司-进口真空镀膜机|真空镀膜设备|Polycold维修厂家 | TPU薄膜_TPU薄膜生产厂家_TPU热熔胶膜厂家定制_鑫亘环保科技(深圳)有限公司 | 安规_综合测试仪,电器安全性能综合测试仪,低压母线槽安规综合测试仪-青岛合众电子有限公司 | 中国产业发展研究网 - 提供行业研究报告 可行性研究报告 投资咨询 市场调研服务 | PE一体化污水处理设备_地埋式生活污水净化槽定制厂家-岩康塑业 | 密封圈_泛塞封_格莱圈-[东莞市国昊密封圈科技有限公司]专注密封圈定制生产厂家 | 上海小程序开发-小程序制作-上海小程序定制开发公司-微信商城小程序-上海咏熠 | 液压升降货梯_导轨式升降货梯厂家_升降货梯厂家-河南东圣升降设备有限公司 | 复合土工膜厂家|hdpe防渗土工膜|复合防渗土工布|玻璃纤维|双向塑料土工格栅-安徽路建新材料有限公司 | 无菌检查集菌仪,微生物限度仪器-苏州长留仪器百科 | 密集架-密集柜厂家-智能档案密集架-自动选层柜订做-河北风顺金属制品有限公司 | 东莞市超赞电子科技有限公司 全系列直插/贴片铝电解电容,电解电容,电容器 | 通风气楼_通风天窗_屋顶风机-山东美创通风设备有限公司 | 塑料异型材_PVC异型材_封边条生产厂家_PC灯罩_防撞扶手_医院扶手价格_东莞市怡美塑胶制品有限公司 | 股票入门基础知识_股票知识_股票投资大师_格雷厄姆网 | 液压油缸-液压缸厂家价格,液压站系统-山东国立液压制造有限公司 液压油缸生产厂家-山东液压站-济南捷兴液压机电设备有限公司 | YJLV22铝芯铠装电缆-MYPTJ矿用高压橡套电缆-天津市电缆总厂 | 德州网站制作 - 网站建设设计 - seo排名优化 -「两山建站」 | 民用音响-拉杆音响-家用音响-ktv专用音响-万昌科技 | 动力配电箱-不锈钢配电箱-高压开关柜-重庆宇轩机电设备有限公司 聚天冬氨酸,亚氨基二琥珀酸四钠,PASP,IDS - 远联化工 | 热镀锌槽钢|角钢|工字钢|圆钢|H型钢|扁钢|花纹板-天津千百顺钢铁贸易有限公司 | 心肺复苏模拟人|医学模型|急救护理模型|医学教学模型上海康人医学仪器设备有限公司 | 苏州同创电子有限公司 - 四探针测试仪源头厂家 | 传递窗_超净|洁净工作台_高效过滤器-传递窗厂家广州梓净公司 |