9

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

鉴于以下条件:

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

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

我的理解是我可能会过得更好,因为我的钥匙不会发生冲突——我可以保证。但是,Java 实现是否有可能通过将同一个桶分配给两个不同的键来搞砸哈希桶?

4

2 回答 2

20

如果您使用多个线程插入,即使键不同,您也绝对应该使用ConcurrentHashMap或同步插入。Plain对于并发写入HashMap 根本不安全。假设两个线程每个都需要同时扩展内部表……即使它们使用不同的键,这也是一个根本性的问题。

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

于 2012-11-21T14:07:34.247 回答
2

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

于 2012-11-21T14:24:43.357 回答