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

时间:2012-11-21 14:04:21

标签: java concurrency hashmap

据我所知,Java 5以后的并发哈希映射为您提供了一个线程安全哈希映射,它不使用对迭代器和更新的阻塞访问(如果并发级别足够)。

考虑到以下条件:

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

    我的理解是,我可能会更好,因为我的钥匙不会发生冲突 - 我可以保证。但是,Java实现是否可能通过将相同的存储桶分配给两个不同的密钥来解决问题?

2 个答案:

答案 0 :(得分:19)

如果您使用多个线程进行插入,即使密钥不同,您也一定要使用ConcurrentHashMap或同步插入。简单HashMap 对于并发写入而言并不安全。假设两个线程都需要同时扩展内部表...即使它们使用不同的键,这也是一个根本上存在问题的情况。

现在,如果你真的真的有充分的证据表明在你的应用程序生命周期的剩余时间内使用ConcurrentHashMap会导致问题(我非常怀疑它是否存在),你或许可以构建一个并发的哈希映射,在单个线程中将其转换为HashMap(甚至是来自Guava的不可变集合),确保在“最终映射”之间存在先发生障碍发表“和”线程阅读最终地图“。

答案 1 :(得分:2)

如果你有跨线程的独立键,你可以考虑独立的地图。如果这是一个选项,每个线程都可以拥有自己的HashMap,只要它只被一个线程使用,它就不需要是线程安全的。