0

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

请注意,与大多数集合不同,size 方法不是恒定时间操作。由于这些集合的异步特性,确定当前元素的数量需要遍历元素,因此如果在遍历期间修改了此集合,则可能会报告不准确的结果。此外,不能保证以原子方式执行批量操作 addAll、removeAll、retainAll、containAll、equals 和 toArray。例如,与 addAll 操作同时运行的迭代器可能只查看一些添加的元素。

问题:对此有缺陷的完整性检查,if(!activeQueueSet.add(queue))但正如您从文档中看到的那样,它是一个 O(n) 操作,即遍历整个集合,这在某种程度上误解了列表的状态很多次。我正在寻找一个万无一失的健全性检查。

4

1 回答 1

1

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

但是请注意,add()remove()方法是线程安全的,所以只要你使用这些来修改你的集合,你就可以了。

这将取决于您的特定应用程序如何处理它。如果元素不存在,但被添加,那很好。如果元素一开始就在那里,因此没有添加,那是不是很糟糕?

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

于 2016-08-03T21:50:47.867 回答