WeakHashMap和并发修改

jer*_*mie 2 java concurrency multithreading garbage-collection

我正在阅读有关WeakHashMap的Java Doc ,我得到了基本概念.由于GC线程在后台运行,您可以获得"异常行为",例如迭代时的ConcurrentModificationException等.

我没有得到的是,如果默认实现没有同步并且不以任何方式包含锁,那么为什么不可能获得不一致的状态.假设你有2个主题.GC线程在某个索引处同时并在同一索引处删除某个键,用户线程在该数组中插入一个键值对.

对我来说,如果没有同步,那么获得不一致的哈希映射的风险很高.

更糟糕的是,做这样的事情实际上可能是非常危险的,因为v实际上可能是空的.

if (map.contains(k)) {
   V v = map.get(k)
}
Run Code Online (Sandbox Code Playgroud)

我错过了什么吗?

use*_*ica 5

您提到的不一致状态问题不会出现,因为GC不会主动重组WeakHashMaps.当垃圾收集器释放弱引用的引用时,相应的条目不会从映射中物理移除; 条目只是陈旧,没有钥匙.稍后,在地图上的某些其他操作期间可以物理地移除该条目,但GC将不承担该责任.

您可以在grepcode上看到一个Java版本的此设计实现.