【发布时间】:2016-02-10 04:47:24
【问题描述】:
如果我声明ConcurrentHashMap<Person, Interests>
- 如果我覆盖Person.hashCode() 以产生相同的哈希值[糟糕的设计你!],那么所有元素都放在同一个桶中
- 默认的 concurrencyLevel[16] 如何帮助并发写入?
我的理解是,在上述情况下,Map 条目没有分布。因此,在修改特定的 <K,V> 时,会在唯一存在的 hashBucket 上建立锁定,因此其他线程无法修改其他 <K1,V1> 并从并发修改中受益
【问题讨论】:
-
在我看来,您的中心假设是无效的。 Javadoc 明确指出“
concurrencyLevel影响内部大小”。 -
它如何影响内部尺寸?假设我的地图中有 100 个元素,并且都进入同一个桶。由于所有元素都属于同一段,因此只有一个线程可以修改 Map,其余的被阻塞。
标签: java multithreading collections concurrenthashmap