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

时间:2013-08-18 19:06:52

标签: java concurrency hashset java.util.concurrent concurrenthashmap

假设我有一组请求ID,我已经从客户端发送到服务器。服务器的响应返回我发送的请求ID,然后我可以从哈希集中删除它。这将以多线程方式运行,因此多个线程可以添加到哈希集中并从中删除ID。但是,由于生成的ID是唯一的(从线程安全的来源,现在假设AtomicInteger为每个新请求更新),HashSet是否需要ConcurrentHashSet

我认为这可能导致问题的唯一情况是HashSet遇到可能需要对基础HashSet对象进行数据结构更改的冲突,但似乎不会发生这种情况在这个用例中。

1 个答案:

答案 0 :(得分:3)

是。由于哈希表的底层数组可能需要调整大小,因为当然ID可能会发生冲突。因此,拥有不同的密钥根本无济于事。

但是,因为您知道ID正在增加,并且您可以在未完成的最大ID数上限(例如1000)。您可以使用上限和下限以及固定大小的数组,并使用最低键的偏移量索引,在这种情况下,您不需要任何互斥锁或并发数据结构。这种数据结构非常脆弱,但是如果你有超过你的上限,那么地狱就会破裂。因此,除非考虑性能,否则只需使用ConcurrentHashSet