将唯一值并发写入java HashSet

时间:2016-04-15 08:26:01

标签: java concurrency thread-safety

我想知道在Java中使用并发HashSet是否是线程安全的,如果我们可以保证每个线程都可以添加()/ remove,那么可以发生多于1个线程的并发写入)只有一个独特的值

例如,一个线程可以向{/ 1}}自己的id添加()/ remove()

我已经读过,在HashSet中有并发写入的情况下,它不是线程安全的但是我不明白为什么在我之前的例子中这是真的。 由于每个线程只能添加()/ remove()一个唯一的值(如threadID),不会在另一个线程中添加或删除,因此线程插入和删除之间没有依赖关系,为什么这不是线程安全的吗?

最后,是否有更智能的方式来实现此功能,而不是创建包含空值的键的HashSet

编辑:我已阅读this post,但我的问题仍然没有得到解答。我不明白为什么ConcurrentHashMap会受到不同值的并发写入的影响。

1 个答案:

答案 0 :(得分:0)

HashSetHashMap使用散列机制来确定将新条目放入哪个存储桶。通常,只要密钥不同,这就不会受并行访问的影响。< / p>

仔细观察铲斗尺寸,因为如果它们开始变大,性能会受到重创。当HashSet的广告资源过满时会触发resize。这将所有铲斗重新排列成更好的布局。

如果另一个线程在期间尝试写/读resize很可能是因为结构处于重新排列状态而导致进程崩溃。

如果正常的同步机制看起来过于繁琐,那么最好使用ReadWriteLock。有关使用提示,请参阅here