1. 程式人生 > >GOF23—單例模式(2)

GOF23—單例模式(2)

應該 一個 img bsp 漏洞 資源 nbsp 創建 就會

本文介紹單例模式(不包含枚舉單例模式)漏洞問題以及如何防止漏洞

  1.反射可以破解單例模式,例子如下:

  技術分享

  技術分享

此時,我們運行Client類,發現s1和s2是一個對象,但s3和s4是不同的對象。

那麽如何防止這種現象的發生呢,我們在私有化的構造方法裏添加異常拋出,這樣在對象存在的時候,通過反射調用私有化的構造方法,就會發生異常。

技術分享

  2.通過反序列化的方式破解

  —首先我們要讓單例模式的類實現Serializable接口,這樣才可以序列化。其次,用ObjectOuputStream將對象寫入硬盤,在用ObjectInputStream

從硬盤中讀出來。

  技術分享

  技術分享

看運行的結果我們可以得知,s3與s1不是一個對象。

針對這種通過反序列化破解單例的方法,我們應該如何避免呢。

  技術分享

將上面的方法,定義在單例模式的類中,則反序列化只會返回已經創建好的對象。

關於這五種單例模式在多線程下的效率關系,

惡漢式>靜態內部類式>枚舉式>雙重檢查鎖式>懶漢式(因為加了同步)

關於如何選擇合適的單例模式:

—單例對象占用資源少,不需要延時加載

    枚舉式好於惡漢式

—單例對象占用資源大,需要延時加載

    靜態內部類式 好於懶漢式

GOF23—單例模式(2)