gpt4 book ai didi

java - 是否有针对动态队列集的万无一失的健全性检查

转载 作者:行者123 更新时间:2023-12-01 09:37:23 25 4
gpt4 key购买 nike

我有一个由 ConcurrentSkipListSet 制成的对象 QueueSet在Java中

Beware that, unlike in most collections, the size method is not a constant-time operation. Because of the asynchronous nature of these sets, determining the current number of elements requires a traversal of the elements, and so may report inaccurate results if this collection is modified during traversal. Additionally, the bulk operations addAll, removeAll, retainAll, containsAll, equals, and toArray are not guaranteed to be performed atomically. For example, an iterator operating concurrently with an addAll operation might view only some of the added elements.

问题:此 if(!activeQueueSet.add(queue)) 的健全性检查存在缺陷,但正如您从文档中看到的,它的复杂度为 O(n)操作,即遍历整个集合,这会多次误解列表的状态。我正在寻找对此进行万无一失的健全性检查。

最佳答案

确实,您的 ConcurrentSkipListSet.add(element) 可以返回 truefalse,具体取决于该集合是否同时被修改另一个使用迭代器的线程,这里是 weakly consistent ,或通过非原子的批量方法(即xxxAll())。

但请注意,add()remove() 方法是线程安全的,因此只要您修改您的集合这些你都会没事的。

如何处理取决于您的特定应用程序。如果该元素不存在但已添加,那就很好。如果该元素一开始就存在并且因此没有添加,那会很糟糕吗?

您可以设计一个包含(或可能扩展)ConcurrentSkipListSet 的类,该类具有非常受控的 API,可防止任何有问题的操作或通过使用锁使它们成为线程安全的。

关于java - 是否有针对动态队列集的万无一失的健全性检查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38753916/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com