精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

亚洲第一级黄色片| 亚洲少妇30p| 中文字幕欧美亚洲| www.日本一区| 超碰在线caoporn| 成人免费观看av| 国产成人精品日本亚洲| 男人av资源站| 日韩aaa久久蜜桃av| 日本高清免费不卡视频| 国产一区二区三区在线免费| 可以在线观看的黄色| 国产麻豆视频一区| 国产成人精品久久二区二区| 精品国产乱码久久久久久鸭王1| 四虎影视精品| 欧美一级欧美三级在线观看| 国产一区二区三区精彩视频| 在线午夜影院| 国产免费观看久久| 精品乱码一区| 国产免费久久久| 丝袜美腿高跟呻吟高潮一区| 欧美丰满片xxx777| 国产精品久久国产精麻豆96堂| 黄色欧美在线| 日韩欧美久久久| 国产区二区三区| 欧美aaaaa性bbbbb小妇| 亚洲精品久久久蜜桃| 亚洲黄色一区二区三区| 日本一区高清| 丰满白嫩尤物一区二区| 国产精品十八以下禁看| 中文字幕国产在线观看| 一区免费在线| 久99久在线视频| 潘金莲一级黄色片| 99精品视频在线观看免费播放| 精品亚洲永久免费精品| 日本人添下边视频免费| 日韩欧美另类中文字幕| 正在播放一区二区| 精品久久久久久中文字幕2017| 日本不卡免费高清视频在线| 亚洲国产精品一区二区久久 | 激情久久av一区av二区av三区 | 午夜激情在线| 亚洲男同性恋视频| 欧美性受黑人性爽| 国产一二三区在线观看| 综合久久国产九一剧情麻豆| 在线国产伦理一区| 免费在线看黄| 亚洲人成影院在线观看| gogogo免费高清日本写真| 免费在线观看黄色| 亚洲人吸女人奶水| 欧美 国产 精品| 黄色网在线播放| 亚洲人亚洲人成电影网站色| 黄色一级片av| 丁香花在线观看完整版电影| 亚洲成人资源在线| www.国产在线播放| 午夜激情电影在线播放| 色综合婷婷久久| 亚洲性生活网站| 人人精品久久| 日韩欧美国产综合在线一区二区三区| 香蕉视频xxxx| gogo人体一区| 日韩精品欧美国产精品忘忧草| 久久偷拍免费视频| 精品免费视频| 欧美理论片在线观看| 国产成人精品av久久| 亚洲欧美清纯在线制服| 国产精品免费一区豆花| 国产草草影院ccyycom| 福利一区二区在线| 欧美激情第一页在线观看| 啊v视频在线| 亚洲精品日日夜夜| 日韩精品―中文字幕| 经典三级一区二区| 欧美一二三区在线| 37p粉嫩大胆色噜噜噜| 日韩av片子| 欧美极品少妇xxxxⅹ裸体艺术 | 美女网站久久| 国产在线一区二区三区| 黄色一级a毛片| 国产日韩欧美制服另类| 黄色网zhan| 亚洲美女久久精品| 欧美一区二区三区电影| 欧美黑人欧美精品刺激| 亚洲女同另类| 日本欧美爱爱爱| 99久久久国产精品无码网爆| 久久综合国产精品| 久久久久久久久久久久久国产| 少妇视频一区| 欧美成人一区二区三区在线观看| 精品人妻一区二区三区视频| 欧美三区美女| 国产免费一区视频观看免费| 少妇喷水在线观看| 亚洲欧美日韩在线不卡| 色综合av综合无码综合网站| 麻豆一区在线| 一区二区三区视频免费| 99热在线观看免费精品| 国产一区二区按摩在线观看| 日本一区二区三区视频在线播放| xxxx成人| 免费人成精品欧美精品| 中文一区一区三区高中清不卡| 亚洲精品中文字幕乱码三区不卡| av蜜臀在线| 日韩一区二区影院| 国产又黄又粗又猛又爽的| 亚洲欧美日本日韩| 国产亚洲精品美女久久久m| 日本电影在线观看网站| 欧美性一区二区| 人妻精品久久久久中文字幕| 亚洲理论在线| 91视频99| 天堂av最新在线| 91精品国产综合久久精品app| 一级在线观看视频| 视频一区视频二区中文字幕| 久久精品ww人人做人人爽| 成人直播在线| 91精品国产欧美一区二区18 | 国产精品久久久久久久久图文区| 免费无码av片在线观看| 色吊丝一区二区| 欧美性受xxxx黑人猛交| 天天干,天天操,天天射| 婷婷国产v国产偷v亚洲高清| 日本五十肥熟交尾| 亚洲黄网站黄| 久久亚洲精品欧美| 色戒汤唯在线| 亚洲视频在线观看视频| 91丨九色丨海角社区| 久久久久久亚洲综合| 男人舔女人下面高潮视频| 蜜乳av综合| 国产精品免费小视频| 在线观看美女网站大全免费| 欧美视频一区二区| 99热这里只有精品4| 久久成人18免费观看| 丰满人妻一区二区三区53号| 日本免费一区二区三区视频| 久久久久中文字幕2018| 无码精品人妻一区二区| 欧美性猛交视频| 国产真人真事毛片视频| 久久99国内精品| 中文字幕人妻熟女人妻洋洋| 成人性生交大片免费看中文视频| 性欧美在线看片a免费观看| 欧洲伦理片一区 二区 三区| 91成人在线免费观看| 亚洲aaa视频| 国产精品主播直播| 国产96在线 | 亚洲| 神马影视一区二区| 国产精品免费观看在线| 污视频网站免费在线观看| 日韩成人在线视频网站| 中文字幕免费在线看| 亚洲天堂中文字幕| 日韩av无码一区二区三区不卡 | 97精品国产一区二区三区| 亚洲一区二区三区成人在线视频精品| 国产啊啊啊视频在线观看| 亚洲美女精品久久| 国产又粗又猛又黄又爽| 亚洲成av人片| www.xx日本| hitomi一区二区三区精品| 久久黄色片网站| 亚洲精品字幕| 正在播放亚洲| 综合国产视频| 99r国产精品视频| 成人mm视频在线观看| 国内外成人免费激情在线视频 | 中文字幕中文字幕中文字幕亚洲无线| 伊人五月天婷婷| 先锋a资源在线看亚洲| a级网站在线观看| 国产探花一区二区| 不卡视频一区| 久久久加勒比| 欧美在线视频播放| 成人国产免费电影| 在线观看国产精品日韩av| 蜜桃视频污在线观看| 欧美日韩国产美| 香蕉影院在线观看| 亚洲一二三四久久| 黄色录像一级片| 国产视频一区在线播放| 无码国产精品一区二区免费式直播 | 亚洲免费成人在线视频| 久久精品人人| 国产一级不卡视频| 婷婷综合视频| 午夜精品区一区二区三| 欧美女优在线视频| 精品久久久久久亚洲| 一区二区在线免费播放| 91久久在线播放| 成人国产激情在线| 日本aⅴ大伊香蕉精品视频| 波多野结衣在线观看| 久久色在线播放| 日韩伦理在线电影| 中文字幕久久亚洲| 福利在线视频导航| 亚洲色图18p| 欧洲毛片在线| 国产婷婷97碰碰久久人人蜜臀| 欧美一级特黄aaaaaa| 日韩一区二区三区四区| 国产日韩在线观看一区| 8v天堂国产在线一区二区| 一区二区三区麻豆| 欧美性做爰猛烈叫床潮| www.久久视频| 欧美午夜不卡视频| 中文字幕91爱爱| 欧美午夜精品免费| 在线免费观看日韩视频| 欧美午夜精品理论片a级按摩| 中文字幕1区2区3区| 精品视频全国免费看| 一区二区视频在线免费观看| 欧美日韩黄视频| 中文字幕你懂的| 欧美久久高跟鞋激| 国内老熟妇对白xxxxhd| 欧美成人一级视频| 日韩一级在线播放| 日韩高清人体午夜| 国产三级视频在线看| 中文字幕国产亚洲2019| 欧美黄色激情| 九九视频这里只有精品| 大菠萝精品导航| 日韩av电影在线播放| 一区二区视频免费完整版观看| 国产精品户外野外| 高清一区二区中文字幕| 高清国产在线一区| 日本三级久久| 视频一区视频二区视频三区高| 四虎成人精品永久免费av九九| 黄色影视在线观看| 亚洲国产高清视频| 毛葺葺老太做受视频| 紧缚捆绑精品一区二区| 国模大尺度视频| 91日韩在线专区| 大胸美女被爆操| 亚洲一区二区三区免费视频| 影音先锋亚洲天堂| 欧美日韩精品电影| 成人精品在线播放| 亚洲天堂免费观看| 二区三区在线观看| 青青久久av北条麻妃黑人| 香蕉成人在线| 国产日韩欧美综合精品| 成人羞羞网站| 日本人妻伦在线中文字幕| 日韩精品一级二级 | 2017欧美狠狠色| 国产精品嫩草影院俄罗斯| 五月激情综合网| 国产欧美日韩综合精品一区二区三区 | 中文字幕视频一区| 特一级黄色大片| 欧美精品三级在线观看| 天堂中文在线官网| 久久视频免费在线播放| 日韩大片免费观看| 亚洲一区二区在线| 精品国产视频| www精品久久| 激情综合色丁香一区二区| 中文字幕乱码在线| 亚洲人成人一区二区在线观看| 欧美在线观看不卡| 精品国产一区二区亚洲人成毛片| a天堂中文在线88| 国内精品小视频| 日韩精品一区二区三区中文字幕 | 91九色综合久久| 亚洲区小说区图片区qvod按摩| 樱空桃在线播放| 秋霞av亚洲一区二区三| 女同毛片一区二区三区| 亚洲免费在线电影| 自拍偷拍福利视频| 亚洲毛片在线免费观看| av在线理伦电影| 91久久综合亚洲鲁鲁五月天| 日韩欧美在线中字| 99久久激情视频| 99久久er热在这里只有精品15 | 久久动漫亚洲| 俄罗斯黄色录像| 亚洲精品免费看| 亚洲熟妇无码久久精品| 国产一区二区三区视频在线观看| 麻豆网站免费在线观看| 成人av免费电影| 亚洲欧美一级二级三级| 老司机午夜性大片| 国产精品久久久久久久浪潮网站 | 欧美大胆一级视频| 操你啦视频在线| 成人在线观看视频网站| 久久网站免费观看| 亚洲高清免费在线观看| 国产精品麻豆久久久| 亚洲性猛交富婆| 在线午夜精品自拍| 国产黄色精品| 伊人色综合影院| 久久爱www久久做| 三级黄色录像视频| 在线不卡中文字幕播放| 日本高清视频在线播放| 91精品国产综合久久久久久蜜臀| 久久免费av| 污污网站在线观看视频| 中文字幕日本乱码精品影院| 国产免费av观看| 欧美成人亚洲成人| 91精品国产自产精品男人的天堂| 800av在线免费观看| 成人一级视频在线观看| 亚洲综合一二三| 精品调教chinesegay| 日韩不卡在线| 一本一生久久a久久精品综合蜜| 久久99精品久久久久久动态图| 中文字幕无码日韩专区免费 | 亚洲黄色三级| 久久久久久久久免费看无码 | 中文字幕国产传媒| 国产精品久久看| 国产三级精品在线观看| 欧美极品美女电影一区| 偷拍自拍亚洲色图| 国产精品久久a| 伊人色综合久久天天| 天堂成人在线视频| 国产精品美乳一区二区免费| 婷婷综合在线| 制服丝袜第一页在线观看| 色婷婷精品大视频在线蜜桃视频| 无遮挡的视频在线观看| 波多野结衣精品久久| 久久久999| 欧美成人黄色网| 亚洲精品一区二三区不卡| 99re66热这里只有精品4| 一级黄色片播放| 久久在线观看免费| 国产特级aaaaaa大片| 538国产精品视频一区二区| 欧美高清视频手机在在线| 成人欧美精品一区二区| 欧美性色综合网| 久久久久黄久久免费漫画| 欧美日韩天天操| 国产成人综合在线| 黄瓜视频在线免费观看| 欧美刺激性大交免费视频| 亚洲激情播播| 中文字幕在线观看视频www| 一本大道综合伊人精品热热 | 一区二区高清在线| 激情小视频在线| 成人毛片网站| 男女男精品视频网| 欧美日韩乱国产| 色综合久久久久久中文网| 成人综合一区| 双性尿奴穿贞c带憋尿|