之前見過可以通過反射來破壞單例,和如何防止被破壞。今天講一下序列化破壞單例。
新建類 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 方法。下面我們先簡要地回顧下物件的序...