假设我有一个从客户端发送到服务器的请求 ID 的哈希集。服务器的响应返回我发送的请求 ID,然后我可以将其从哈希集中删除。这将以多线程方式运行,因此多个线程可以在哈希集中添加和删除 ID。但是,由于生成的 ID 是唯一的(来自线程安全源,假设现在有一个 AtomicInteger,它会针对每个新请求进行更新),因此是否需要将 HashSet
ConcurrentHashSet ?
我认为唯一可能导致问题的情况是 HashSet
遇到冲突,这可能需要对底层 HashSet
对象进行数据结构更改,但事实并非如此。在这个用例中似乎不会发生这种情况。
最佳答案
是的。例如,由于哈希表的底层数组可能需要调整大小,而且当然 ID 可能会发生冲突。因此,拥有不同的 key 根本没有帮助。
但是,既然您知道 ID 正在增加,并且您是否可以对未完成的 ID 的最大数量设置上限(假设为 1000)。您可以使用上限和下限以及固定大小的数组,并从最低键开始进行偏移索引,在这种情况下,您将不需要任何互斥体或并发数据结构。然而,这样的数据结构非常脆弱,因为如果你的数据超过上限,那么未决的 hell 就会崩溃。因此,除非考虑性能,否则只需使用 ConcurrentHashSet
。
关于java - 如果线程使用不同的键,是否需要 ConcurrentHashSet?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18302694/