我的問題值鍵關聯是:我怎樣才能一堆值的一串鑰匙如何無阻塞GC
- 沒有直接修改鍵關聯,並
- 不妨礙從得到GC'd鍵(明知值必須鍵強引用)
背景:
我需要用一些特定的對象(稱它們爲鍵)將一堆複雜的對象(稱之爲值)關聯起來。
通常情況下,我會這樣做的方式是使用關聯鍵和值的散列表。
This works great。但是,我還需要確保映射不會干擾密鑰的垃圾收集。換句話說,映射的存在不應該阻止密鑰被垃圾收集。
正常情況下,解決這個問題的方法是使用WeakHashMap,它只保存WeakReference的關鍵字。但是,WeakHashMaps只有在地圖中的值不具有對鍵的強引用時纔有效。不幸的是,我的值都強烈地引用了我的密鑰,這可以防止密鑰被垃圾收集。這可以通過對值使用弱引用來解決,但這不是一個可行的解決方案,因爲我不能讓我的值在我的密鑰之前GC'd。只要關鍵對象仍然存在,這些值也必須存在。
因此,我對這種情況的典型解決方案是停止使用HashMap,而是修改鍵以強有力地引用它所需的所有值。這將確保我仍然可以獲得給定密鑰的所有值,但不會阻止密鑰在自然生命週期完成時獲取GC'd。
不幸的是,我不能修改鍵,所以我不能直接將值添加到鍵。那麼還有什麼其他聰明的解決方案?
,你的意思是刪除值的關鍵在於強大的參考?可悲的是,我無法修改這些值(或者說,我無法阻止用戶輸入對鍵有強烈參考的值,並且很有可能他們會這樣做) – emmby 2012-04-17 18:22:44
是的,這就是我的意思。除非你爲鍵使用singleton/enum/flyweight模式類型,否則我仍然認爲你應該能夠在'WeakHashMap'中使用不同但在邏輯上相同的鍵來解決這個問題。 – 2012-04-17 18:24:42
什麼將這些鍵保存在地圖中?他們不會在任意時間出現GC嗎? – emmby 2012-04-17 18:39:03