如果每个线程插入唯一键,是否需要并发哈希映射?

Apo*_*sia 9 java concurrency hashmap

根据我的理解,从Java 5开始的并发哈希映射为您提供了一个线程安全哈希映射,它不使用对迭代器和更新的阻塞访问(如果并发级别足够).

鉴于以下条件:

  1. 插入仅发生一次(在应用程序初始化期间).
  2. 每个线程都会获得一组要插入的键,这些键不会被任何其他线程共享.
  3. 更新永远不会发生.
  4. 选择仅在应用程序初始化结束后发生.

使用简单的哈希映射会更好吗?

我的理解是,我可能会更好,因为我的钥匙不会发生冲突 - 我可以保证.但是,通过将相同的存储桶分配给两个不同的密钥,Java实现是否可能会在哈希桶中搞砸?

Jon*_*eet 19

如果您使用多个线程插入,即使键不同,您也一定要使用ConcurrentHashMap或同步插入.平原HashMap 根本就没有安全的并发写入.假设两个线程每个都需要同时扩展内部表...即使他们使用不同的键,这是一个根本上有问题的情况.

现在,如果你真的真的有很好的证据表明,使用ConcurrentHashMap你的应用程序生命周期的其他部分造成的问题(我很怀疑它),你也许可以建立一个并发的哈希表入手,将其转换为一个HashMap(或者甚至是来自Guava的不可变集合在一个线程中,确保在"最终地图发布"和"线程阅读最终地图"之间发生了前所未有的障碍.