据我了解,从 Java 5 开始的并发哈希映射为您提供了一个线程安全的哈希映射,它不使用迭代器和更新的阻塞访问(如果并发级别足够的话)。
鉴于以下条件:
- 插入只发生一次(在应用程序初始化期间)。
- 每个线程都有一组要插入的键,这些键不被任何其他线程共享。
- 更新永远不会发生。
- 选择仅在应用程序初始化结束后发生。
使用简单的哈希映射会更好吗?
我的理解是我可能会过得更好,因为我的钥匙不会发生冲突——我可以保证。但是,Java 实现是否有可能通过将同一个桶分配给两个不同的键来搞砸哈希桶?
据我了解,从 Java 5 开始的并发哈希映射为您提供了一个线程安全的哈希映射,它不使用迭代器和更新的阻塞访问(如果并发级别足够的话)。
鉴于以下条件:
使用简单的哈希映射会更好吗?
我的理解是我可能会过得更好,因为我的钥匙不会发生冲突——我可以保证。但是,Java 实现是否有可能通过将同一个桶分配给两个不同的键来搞砸哈希桶?
如果您使用多个线程插入,即使键不同,您也绝对应该使用ConcurrentHashMap
或同步插入。Plain对于并发写入HashMap
根本不安全。假设两个线程每个都需要同时扩展内部表……即使它们使用不同的键,这也是一个根本性的问题。
现在,如果您确实有充分的证据表明ConcurrentHashMap
在应用程序生命周期的其余时间使用 a 会导致问题(我非常怀疑它确实如此),您也许可以构建一个并发哈希映射开始,将其转换为HashMap
(甚至是来自Guava的不可变集合)在单个线程中,确保“最终地图已发布”和“线程读取最终地图”之间存在发生前的障碍。
如果你有跨线程的独立键,你可以考虑独立映射。如果这是一个选项,每个线程都可以有自己的 HashMap,只要它只被一个线程使用,它就不需要是线程安全的。