java - 如果线程使用不同的键,是否需要 ConcurrentHashSet?

标签 java concurrency hashset java.util.concurrent concurrenthashmap

假设我有一个从客户端发送到服务器的请求 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/

相关文章:

java - 哈希集对象

java - 多个 Tomcat validator 阀

java - 公开 keySet() 的线程安全方式

java - 对 Java、Groovy、Jython 和 Python 进行基准测试

java - JRE 如何为具有非有效最终局部变量的 lambda 体创建并发问题?

ios - GCD 中的并发队列与串行队列

Java 并发 - 现代示例、教程、练习、分步应用程序

java - 如何使 java HashSet/HashMap 与任何对象一起工作?

java - 使用 ServletContextListener 进行部署时出现 Catalina 错误

java - 使用 protobuf 的 REST Java Web 服务