GOF23—單例模式(2)
阿新 • • 發佈:2017-05-04
應該 一個 img bsp 漏洞 資源 nbsp 創建 就會
本文介紹單例模式(不包含枚舉單例模式)漏洞問題以及如何防止漏洞
1.反射可以破解單例模式,例子如下:
此時,我們運行Client類,發現s1和s2是一個對象,但s3和s4是不同的對象。
那麽如何防止這種現象的發生呢,我們在私有化的構造方法裏添加異常拋出,這樣在對象存在的時候,通過反射調用私有化的構造方法,就會發生異常。
2.通過反序列化的方式破解
—首先我們要讓單例模式的類實現Serializable接口,這樣才可以序列化。其次,用ObjectOuputStream將對象寫入硬盤,在用ObjectInputStream
從硬盤中讀出來。
看運行的結果我們可以得知,s3與s1不是一個對象。
針對這種通過反序列化破解單例的方法,我們應該如何避免呢。
將上面的方法,定義在單例模式的類中,則反序列化只會返回已經創建好的對象。
關於這五種單例模式在多線程下的效率關系,
惡漢式>靜態內部類式>枚舉式>雙重檢查鎖式>懶漢式(因為加了同步)
關於如何選擇合適的單例模式:
—單例對象占用資源少,不需要延時加載
枚舉式好於惡漢式
—單例對象占用資源大,需要延時加載
靜態內部類式 好於懶漢式
GOF23—單例模式(2)