java - 如何自动增加 HashMap 中的键?

标签 java hashmap concurrenthashmap

我有一个多线程应用程序。多个线程将事物放入 Map 中,其中每个事物都必须具有唯一的 ID。现在我正在为此目的使用 TreeMap,如下所示:

TreeMap<Integer, Thing> things = new TreeMap<>();
things.put(things.isEmpty() ? 0 : things.lastKey() + 1, thing);

但是 TreeMap 不是线程安全的,所以我决定用 ConcurrentHashMap 替换它。

但是我怎样才能使用 HashMap 实现相同的目的呢?那么如何为我放入其中的每个东西生成一个新的唯一 key 呢?

最佳答案

您可以使用 Java 的 AtomicInteger 类生成唯一的整数。为此,它有一个线程安全的 getAndIncrement() 方法。

但是,即使使用不同的键,这也可能导致 HashMap 出现一些不可预测的错误。此处列出了一些示例:Is a HashMap thread-safe for different keys?

所以一定要使用线程安全的映射,或者其他一些更快的线程安全数据结构,比如 Vector。如果您知道将添加多少元素的上限,则使用具有 AtomicInteger 索引的数组是最快的,因为您可以避免所有同步。

关于java - 如何自动增加 HashMap 中的键?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47595247/

相关文章:

java - 从不同的类访问 HashMap

java - 使用线程安全对 concurrentHashMap 进行排序

java - 如何自动打印 PDF

java - SwingWorker 使用一张 map 更新多个组合、列表、表格

java - 返回嵌套的 HashMap

java - 如何使用 RestEasy 和 Tomcat 让 MessageBodyWriter 与 HashMap 一起使用?

java - 修改 ConcurrentHashMap 中的值

java - 在两个不同端口上具有两个服务的 Spring Boot 应用程序

java - 如何在Java中将FTPFile列表转换为文件列表?

java - 使用 org.apache.commons.codec.binary.Base64InputStream 解码 Base64 文件