單例模式5 1(序列化破壞單例)

2021-10-03 12:39:24 字數 902 閱讀 1602

之前見過可以通過反射來破壞單例,和如何防止被破壞。今天講一下序列化破壞單例。

新建類 serializablesingletion,其實就是餓漢式單例,只是實現了serializable介面

public class serializablesingletion implements serializable 

public static serializablesingletion getinstance()

}

新建測試類

public class test catch (exception e)}}

通過驗證,發現序列化已破壞單例。那如何去解決?在類中新增乙個方法readresolve()

public class serializablesingletion implements serializable 

public static serializablesingletion getinstance()

private object readresolve()

}

跟蹤原始碼如下圖

這個方法裡面有判斷是否存在readresolve方法

原始碼裡面

case tc_object:

return checkresolve(readordinaryobject(unshared));

繼續跟蹤readordinaryobject方法就會發現,如下圖 就會判斷是否包含readresolve方法,如果有就通過反射呼叫方法得到返回值

單例設計模式 序列化破壞單例模式?

1 問題猜想,假如將乙個物件通過序列化放到乙個檔案後,再取出來看是否與本身相等?public class hungrysingleton implements serializable private hungrysingleton public static hungrysingleton get...

單例模式,解決單例破壞。

破壞單例模式的三種方法 執行緒安全情況下 單例模式有 3 個特點 單例類只有乙個例項物件 該單例物件必須由單例類自行建立 單例類對外提供乙個訪問該單例的全域性訪問點。單例模式的優點和缺點 單例模式的優點 單例模式可以保證記憶體裡只有乙個例項,減少了記憶體的開銷。可以避免對資源的多重占用。單例模式設定...

單例模式及單例物件的可序列化

為了使乙個單例類變成可序列化的,僅僅在宣告中新增 implements serializable 是不夠的。因為乙個序列化的物件在每次返序列化的時候,都會建立乙個新的物件,而不僅僅是乙個對原有物件的引用。為了防止這種情況,可以在單例類中加入readresolve 方法。下面我們先簡要地回顧下物件的序...