我想知道在Java中使用并发HashSet
是否是线程安全的,如果我们可以保证每个线程都可以添加()/ remove,那么可以发生多于1个线程的并发写入)只有一个独特的值
例如,一个线程可以向{/ 1}}自己的id添加()/ remove()
我已经读过,在HashSet
中有并发写入的情况下,它不是线程安全的但是我不明白为什么在我之前的例子中这是真的。 由于每个线程只能添加()/ remove()一个唯一的值(如threadID),不会在另一个线程中添加或删除,因此线程插入和删除之间没有依赖关系,为什么这不是线程安全的吗?
最后,是否有更智能的方式来实现此功能,而不是创建包含空值的键的HashSet
?
编辑:我已阅读this post,但我的问题仍然没有得到解答。我不明白为什么ConcurrentHashMap
会受到不同值的并发写入的影响。
答案 0 :(得分:0)
HashSet
和HashMap
使用散列机制来确定将新条目放入哪个存储桶。通常,只要密钥不同,这就不会受并行访问的影响。< / p>
仔细观察铲斗尺寸,因为如果它们开始变大,性能会受到重创。当HashSet
的广告资源过满时会触发resize。这将所有铲斗重新排列成更好的布局。
如果另一个线程在期间尝试写/读,resize
很可能是因为结构处于重新排列状态而导致进程崩溃。
如果正常的同步机制看起来过于繁琐,那么最好使用ReadWriteLock。有关使用提示,请参阅here。