精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

關于"如何破壞單例"我說了好幾種方式,面試官卻說:我其實隨便問問,沒想到你真會

開發 后端
單例模式(Singleton Pattern)是 Java 中最簡單的設計模式之一。是一種創建型設計模式。他的定義為:保證一個類僅有一個實例,并提供一個訪問它的全局訪問點。

單例模式(Singleton Pattern)是 Java 中最簡單的設計模式之一。是一種創建型設計模式。他的定義為:保證一個類僅有一個實例,并提供一個訪問它的全局訪問點。

單例模式一般體現在類聲明中,單例的類負責創建自己的對象,同時確保只有單個對象被創建。這個類提供了一種訪問其唯一的對象的方式,可以直接訪問,不需要實例化該類的對象。

但是其實,單例并不是完完全全安全的,也是有可能被破壞的。

以下,是一次面試現場的還原,之所以會聊到這個話題,是因為面試官問了我很多關于單例模式的問題,我回答的還可以,之后面試官隨口問了一句"單例絕對安全嗎?",緊接著發生了如下對話:

Q:單例模式絕對安全嗎? 

A:(這個問題我知道,別想難倒我)不一定的,其實單例也是有可能被破壞的?

Q:哦?怎么說? 

A:單例模式其實是對外隱藏了構造函數,保證用戶無法主動創建對象。但是實際上我們是有辦法可以破壞他的。

Q:那你知道有什么辦法可以破壞單例嗎??

A:有一個比較簡單的方式,那就是反射。

反射破壞單例

我們先來一個比較常見的單例模式: 

  1. import java.io.Serializable;  
  2. /**  
  3.  * 使用雙重校驗鎖方式實現單例  
  4.  */  
  5. public class Singleton implements Serializable{  
  6.     private volatile static Singleton singleton;  
  7.     private Singleton (){}  
  8.     public static Singleton getSingleton() {  
  9.         if (singleton == null) {  
  10.             synchronized (Singleton.class) {  
  11.                 if (singleton == null) {  
  12.                     singleton = new Singleton();  
  13.                 }  
  14.             }  
  15.         }  
  16.         return singleton;  
  17.     }  

這個單例模式提供了一個private類型的構造函數,正常情況下,我們無法直接調用對象的私有方法。但是反射技術給我們提供了一個后門。

如下代碼,我們通過反射的方式獲取到Singleton的構造函數,設置其訪問權限,然后通過該方法創建一個新的對象: 

  1. import java.lang.reflect.Constructor;  
  2. public class SingletonTest {  
  3.     public static void main(String[] args) {  
  4.         Singleton singleton = Singleton.getSingleton();  
  5.         try {  
  6.             Class<Singleton> singleClass = (Class<Singleton>)Class.forName("com.dev.interview.Singleton");  
  7.             Constructor<Singleton> constructor = singleClass.getDeclaredConstructor(null);  
  8.             constructor.setAccessible(true);  
  9.             Singleton singletonByReflect = constructor.newInstance();  
  10.             System.out.println("singleton : " + singleton);  
  11.             System.out.println("singletonByReflect : " + singletonByReflect);  
  12.             System.out.println("singleton == singletonByReflect : " + (singleton == singletonByReflect));  
  13.         } catch (Exception e) {  
  14.             e.printStackTrace();  
  15.         }  
  16.     }  

輸出結果為: 

  1. singleton : com.dev.interview.Singleton@55d56113  
  2. singletonByReflect : com.dev.interview.Singleton@148080bb  
  3. singleton == singletonByReflect : false 

如上,通過發射的方式即可獲取到一個新的單例對象,這就破壞了單例。

Q:那這種破壞單例的情況,有辦法避免嗎?

A:其實是可以的,只要我們在構造函數中加一些判斷就行了。

如下方式,我們在Singleton的構造函數中增加如下代碼: 

  1. private Singleton() {  
  2.     if (singleton != null) {  
  3.         throw new RuntimeException("Singleton constructor is called... ");  
  4.     }  

這樣,在通過反射調用構造方法的時候,就會拋出異常: 

  1. Caused by: java.lang.RuntimeException: Singleton constructor is called... 

序列化破壞單例

Q:嗯嗯,挺不錯的,那我們換個問題吧。

A:(這部分面試官在猶豫問我什么問題,我主動提醒了他一句)其實,除了反射可以破壞單例,還有一種其他方式也可以的。

Q:嗯,那你就說說還有什么方式吧 

A:其實通過序列化+反序列化的方式也是可以破壞單例的。

如以下代碼,我們通過先將單例對象序列化后保存到臨時文件中,然后再從臨時文件中反序列化出來: 

  1. public class SingletonTest {  
  2.     public static void main(String[] args) {  
  3.         Singleton singleton = Singleton.getSingleton();  
  4.         //Write Obj to file  
  5.         ObjectOutputStream oos = null 
  6.         try {  
  7.             oos = new ObjectOutputStream(new FileOutputStream("tempFile"));  
  8.             oos.writeObject(singleton);  
  9.             //Read Obj from file  
  10.             File file = new File("tempFile");  
  11.             ObjectInputStream ois = new ObjectInputStream(new FileInputStream(file));  
  12.             Singleton singletonBySerialize = (Singleton)ois.readObject();  
  13.             //判斷是否是同一個對象 
  14.             System.out.println("singleton : " + singleton);  
  15.             System.out.println("singletonBySerialize : " + singletonBySerialize);  
  16.             System.out.println("singleton == singletonBySerialize : " + (singleton == singletonBySerialize));  
  17.         } catch (Exception e) {  
  18.             e.printStackTrace();  
  19.         }  
  20.     }  

輸出結果如下: 

  1. singleton : com.dev.interview.Singleton@617faa95  
  2. singletonBySerialize : com.dev.interview.Singleton@5d76b067  
  3. singleton == singletonBySerialize : false 

如上,通過先序列化再反序列化的方式,可獲取到一個新的單例對象,這就破壞了單例。

因為在對象反序列化的過程中,序列化會通過反射調用無參數的構造方法創建一個新的對象,所以,通過反序列化也能破壞單例。

Q:那這種破壞單例的情況,也同樣有辦法避免嗎?

A:當然也有了。只要修改下反序列化策略就好了。

只需要在Sinleton中增加readResolve方法,并在該方法中指定要返回的對象的生成策略幾可以了。即序列化在Singleton類中增加以下代碼即可: 

  1. private Object readResolve() { 
  2.     return getSingleton();  

Q:為什么增加readResolve就可以解決序列化破壞單例的問題了呢?

A:因為反序列化過程中,在反序列化執行過程中會執行到ObjectInputStream#readOrdinaryObject方法,這個方法會判斷對象是否包含readResolve方法,如果包含的話會直接調用這個方法獲得對象實例。

Q:那如果沒有readResolve方法的話,反序列化的時候會怎么創建對象呢?

A:當然也是反射咯。

Q:那前面不是說使用反射的情況,直接在構造函數拋異常不就行了嗎?

A:這個我還真試過,其實是不行的,反序列化使用的反射構造器和我們代碼中使用反射的構造器不是同一個,反序列化用到的構造器并不會調用到我們對象中的構造函數…balabala…(我也不知道面試官聽不聽得懂,感覺是沒聽懂…) 

Q:哦。OK吧,請問你什么時候可以來上班?

不久之后,我入職了這家公司,在一次和當初的面試官聊天的時候,他無意間和我說:當時我面試你的時候,關于單例的破壞那幾個問題,其實最開始我只是隨口一問,沒想到你給我吹水了20分鐘…當時我就覺得你這家伙是個可造之材。 

 

責任編輯:龐桂玉 來源: Hollis
相關推薦

2023-01-17 17:54:47

MQ數據丟失

2018-01-26 23:23:23

JDBC MySQL數據庫

2020-07-07 07:41:32

Java線程生命周期

2020-07-20 07:48:53

單例模式

2024-01-04 12:33:17

ChatGPTAI視頻

2021-08-12 06:52:02

谷歌面試ArrayList

2024-01-12 10:25:02

蓋茨ChatGPT

2023-05-26 07:25:46

微服務架構Dubbo

2021-12-02 08:19:06

MVCC面試數據庫

2024-08-13 17:56:52

單例裝飾器模式

2021-12-06 08:59:40

RabbitMQ單例寫法

2021-01-27 18:13:35

日志nginx信息

2020-11-24 09:55:37

編程語言C ++Vasa

2021-02-16 10:53:19

單例模式面試

2020-08-03 07:38:12

單例模式

2017-12-26 15:41:26

2019-04-28 14:14:48

爬蟲網絡特價機票

2022-05-09 17:12:32

元宇宙技術生活

2019-10-15 09:46:46

機器學習人工智能計算機

2009-09-28 10:58:45

招聘
點贊
收藏

51CTO技術棧公眾號

欧美日韩精品欧美日韩精品一综合| 日韩中文字幕麻豆| 在线中文字幕一区| 国产日韩欧美一区二区三区四区| 日本免费网站视频| 日韩影片中文字幕| 99麻豆久久久国产精品免费优播| 九九久久综合网站| 国产老头和老头xxxx×| 国产91在线视频蝌蚪| 免费成人在线观看视频| 揄拍成人国产精品视频| 日本www高清视频| 国模精品一区二区| 男人的天堂亚洲一区| 亚洲四色影视在线观看| 一级黄色片网址| 懂色av中文字幕| 亚洲三级网页| 日本韩国欧美三级| 欧美激情第一页在线观看| 日韩精品一区二区av| 久久悠悠精品综合网| 精品福利视频导航| 九色91在线视频| 波多野结衣视频网站| 日韩在线麻豆| 91久久精品一区二区三区| 日韩亚洲视频在线| 中文在线最新版天堂| 日韩一区电影| 91精品久久久久久蜜臀| 最新视频 - x88av| 99久久久国产精品无码网爆| 中文不卡在线| 亚洲大胆美女视频| 成年人黄色片视频| 香蕉视频国产在线观看| 久久99国产精品久久99| 欧美老妇交乱视频| 超碰97在线资源站| av一区在线| 亚洲欧洲日本在线| 官网99热精品| 最近免费中文字幕大全免费版视频| 色棕色天天综合网| 欧美丰满一区二区免费视频 | 男人舔女人下面高潮视频| 福利在线播放| 国产高清不卡一区| 午夜精品福利在线观看| 成人做爰69片免网站| 精品国产第一国产综合精品| 欧美日韩午夜剧场| 色中文字幕在线观看| 午夜视频免费在线| 国产在线视频一区二区三区| 韩剧1988在线观看免费完整版| 麻豆精品免费视频| 欧美一区在线观看视频| 91成人国产精品| 男人c女人视频| 精品影院一区| 懂色av一区二区夜夜嗨| 欧洲成人免费aa| 26uuu成人网| 在线一级成人| 精品卡一卡二卡三卡四在线| 中文字幕视频在线免费观看| 91高清在线观看视频| 久久久国产精品不卡| 99精品99久久久久久宅男| 亚洲 国产 日韩 欧美| 在线观看日韩av电影| 日韩中文字幕免费看| 极品粉嫩小仙女高潮喷水久久| 日韩在线成人| 欧美顶级少妇做爰| 国产无套粉嫩白浆内谢的出处| 国产盗摄一区二区| 亚洲欧美视频在线观看视频| 日韩激情久久| 日本在线视频1区| 丁香一区二区三区| 91av一区二区三区| 国产伦精品一区二区三区免.费| 久久激情婷婷| 97精品国产97久久久久久免费 | 一级日本黄色片| se69色成人网wwwsex| 欧美性猛交xxxx久久久| 久激情内射婷内射蜜桃| 色婷婷在线播放| 亚洲人成网站在线| 日本黄色播放器| 免费人成在线观看播放视频 | 亚洲第一色中文字幕| 女人扒开腿免费视频app| 香蕉久久久久久| 欧美日韩午夜在线| 亚洲这里只有精品| 成人在线高清| 欧美日韩视频在线第一区| av无码精品一区二区三区| 在线观看欧美日韩电影| 欧美天天综合色影久久精品| 欧美精品一区免费| 中国字幕a在线看韩国电影| 精品国产精品自拍| 免费无码av片在线观看| 亚洲人体影院| 91成人网在线| 日本中文字幕二区| 国产精品毛片aⅴ一区二区三区| 欧美夫妻性生活| 国产成人av免费观看| 在线观看视频一区二区三区| 精品国产99国产精品| 日本一区二区在线观看视频| 精品久久对白| 亚洲欧美国产另类| 亚洲精品国产精品国自| 日韩精品第一区| 日韩中文在线观看| 亚洲国产精品免费在线观看| 欧美日一区二区在线观看 | 亚洲日本无吗高清不卡| 国产在线激情视频| 亚洲精品一二三| 僵尸世界大战2 在线播放| 亚洲天堂资源| 欧美男人的天堂一二区| 日本xxxx免费| 在线视频亚洲专区| 久久精品电影网| 日本一区二区不卡在线| 老司机精品导航| 亚洲sss综合天堂久久| 人妻与黑人一区二区三区| 久久久久久久电影| 亚洲欧美一二三| 国产一二三在线| 欧美日韩国产小视频| 年下总裁被打光屁股sp| 欧美日韩123| 欧美成人免费播放| 亚洲另类在线观看| 免费成人你懂的| 国产精品三区四区| a黄色在线观看| 亚洲成a人片在线观看中文| 激情五月亚洲色图| 亚洲一级大片| 伊人亚洲福利一区二区三区| 九九视频免费观看| 日韩成人精品在线观看| 成人免费视频观看视频| 91高清在线| 午夜欧美一区二区三区在线播放| 香港日本韩国三级网站| 麻豆一区二区麻豆免费观看| 精品国产欧美一区二区三区成人| 日韩免费观看一区二区| 国产尤物一区二区| 日韩欧美亚洲区| 欧美黄色视屏| 欧美人xxxx| 国产精品毛片一区二区| 在线不卡视频| 91成人理论电影| 成年人视频在线观看免费| 亚洲超碰精品一区二区| 久久久久久久久久久久久久久国产| 美女呻吟一区| 欧美激情视频一区二区三区不卡| 在线观看xxxx| 国产亚洲精品bt天堂精选| 欧日韩免费视频| 日韩成人在线观看视频| 色噜噜狠狠色综合网图区| 一级片视频在线观看| 成人av免费在线观看| 在线观看三级网站| 视频欧美精品| 深夜福利91大全| 国产美女www爽爽爽| 99re成人在线| 精品少妇一区二区三区在线| 91免费精品国偷自产在线在线| 久久中文字幕国产| 一级爱爱免费视频| 国产精品乱人伦中文| 国产wwwxx| 精品久久影院| 国产精品福利无圣光在线一区| 青青草视频在线观看| 欧美视频免费在线| 国产精品无码一区二区三区免费 | 黄色aaaaaa| 久久久久久免费视频| 成人国产精品av| 美女黄视频在线观看| 欧美日韩国产在线观看| 亚洲精品一区二区三区在线播放| 美女视频网站黄色亚洲| 亚洲国产精品一区二区第一页| 欧美xnxx| 日韩中文在线视频| 国产成人麻豆精品午夜在线 | 亚洲午夜未删减在线观看| 日韩精品一区二区亚洲av| 久久久亚洲精品一区二区三区| 丝袜老师办公室里做好紧好爽| 亚洲精品无吗| 国产成人综合一区二区三区| av在线收看| 91精品国产综合久久久久久久| 蜜臀久久精品久久久用户群体| 国产成人精品亚洲777人妖| 日本免费a视频| 亚洲电影男人天堂| 国产精品高潮呻吟久久av无限| 午夜激情视频在线| 日韩一本二本av| 亚洲黄色一区二区| 国产欧美中文在线| 黄色aaaaaa| 中日韩视频在线观看| 日本高清不卡一区二区三| 狂野欧美性猛交xxxx| 色在人av网站天堂精品| 日韩美女一级视频| 欧美日韩一区二区不卡| 波多野结衣亚洲色图| 99精品视频在线观看| 日韩精品你懂的| 欧美日韩综合| 日韩欧美在线一区二区| 韩国一区二区三区视频| 91精品国产九九九久久久亚洲| 成人在线高清视频| 日韩精品一区国产麻豆| www毛片com| 亚洲美女免费视频| 亚洲av成人无码一二三在线观看| 日韩1区2区日韩1区2区| 国产在线视频综合| 黑丝美女一区二区| 国产成人精品日本亚洲11| 欧美va在线观看| 欧美黑人巨大精品一区二区| 国产福利电影在线| 亚洲成人av资源网| 夜夜嗨av禁果av粉嫩avhd| 亚洲二区视频在线| 天天操夜夜操av| 久久久青草青青国产亚洲免观| 中文字幕永久免费| 另类小说视频一区二区| 波多野结衣之无限发射| 国产精品不卡| 欧美在线一二三区| 一区二区三区免费在线看| 国产精品av在线播放| av日韩国产| 欧美猛男性生活免费| 99re在线视频| 亚洲美女av黄| 欧美一区二不卡视频| 在线成人免费观看| 国产91av在线播放| 黑人巨大精品欧美一区二区免费 | 国产一区视频在线| 在线视频cao| 国内精品中文字幕| 97超碰在线公开在线看免费| 永久555www成人免费| 日韩大片b站免费观看直播| 日韩精品一区二区三区在线观看 | 天天综合av| 久久久久久久一区二区| av中文字幕在线观看| 正在播放亚洲1区| 免费av在线电影| 日韩精品视频在线| 天天干免费视频| 精品国产乱码久久久久久图片| 国产内射老熟女aaaa∵| 欧美日韩精品综合在线| 久久久999久久久| 91久久精品网| 国产精华7777777| 在线精品视频免费观看| 老熟妇仑乱一区二区av| 欧美午夜片欧美片在线观看| www.com国产| 欧美午夜精品久久久久久浪潮 | 欧美嫩在线观看| 一本色道久久综合精品婷婷| 欧美图片一区二区三区| 波多野结衣黄色| 欧洲在线/亚洲| 日本三级一区二区三区| 欧美日韩视频专区在线播放| 一区二区www| 91精品国产综合久久精品麻豆| 99热在线只有精品| 日韩精品在线网站| 人妻一区二区三区免费| 日韩av在线直播| 国产一级片在线| 中文字幕亚洲图片| 免费黄色在线看| 欧美日韩国产va另类| sqte在线播放| 日本免费久久高清视频| 国产一区二区三区朝在线观看| 国产一区视频在线播放| 美女日韩一区| 久久久久久高清| 国产一区二区三区四区二区| 亚洲乱码国产乱码精品天美传媒| 国产精品久久久久久久免费观看 | 四虎一区二区| 五月天综合网站| 日韩成人手机在线| 亚洲欧美日本视频在线观看| 999在线免费视频| 精品亚洲porn| 你懂的在线观看网站| 久久亚洲私人国产精品va媚药| 国产精品国产三级国产专业不 | www.黄色网址.com| 亚洲国产欧美国产综合一区| 妓院一钑片免看黄大片| 国产一区二区免费在线| 自拍视频一区二区| 国产精品国产三级国产aⅴ入口 | 国产综合婷婷| 国产无套粉嫩白浆内谢的出处| 国产九色精品成人porny| 三叶草欧洲码在线| 中文字幕一区二区三区色视频| 国产稀缺真实呦乱在线| 欧美综合视频在线观看| 亚洲国产剧情在线观看| 亚洲天堂免费视频| 羞羞视频在线免费国产| 国产经典一区二区| 视频二区欧美| 婷婷四月色综合| 日韩视频在线一区二区三区 | 亚洲人成网www| 中文字幕欧美人与畜| 亚洲欧美日韩专区| 久久久久亚洲av片无码v| 国产目拍亚洲精品99久久精品| 日本少妇吞精囗交| 欧美精品 日韩| 蝌蚪视频在线播放| 欧美激情第三页| 欧美一区=区三区| 欧美日韩免费高清| 最新成人av网站| 欧美人与性动交α欧美精品| 国产精品视频你懂的| 国产午夜免费福利| 欧美mv日韩mv亚洲| 精品孕妇一区二区三区| 国产精品福利观看| 香蕉视频一区二区三区| 国产美女在线一区| 国产精品夜夜嗨| 成人性生活毛片| 欧美日韩国产小视频在线观看| 男男电影完整版在线观看| 97久久久久久| 高潮久久久久久久久久久久久久| 中文字幕一区二区三区四区五区六区| 久久久久国内| 老熟妇精品一区二区三区| 一区二区高清在线| av中文字幕播放| 久久在线视频在线| 久久精品黄色| 视频一区不卡| 日日夜夜一区二区| 97超碰在线资源| 欧美性精品220| 日色在线视频| 日本国产高清不卡| 日本欧美高清| 无码aⅴ精品一区二区三区浪潮| 99久久精品国产一区二区三区| 国产真实夫妇交换视频| 精品日韩欧美在线| 国产精品偷拍| 国产精品制服诱惑| 国产午夜久久| 成都免费高清电影|