所以我有一个由Java中的ConcurrentSkipListSet制作的对象QueueSet
请注意,与大多数集合不同,size方法不是常量操作。由于这些集合的异步性质,确定当前元素数量需要遍历元素,因此如果在遍历期间修改此集合,则可能会报告不准确的结果。此外,批量操作addAll,removeAll,retainAll,containsAll,equals和toArray不保证以原子方式执行。例如,与addAll操作同时运行的迭代器可能只查看一些添加的元素。
问题:对此if(!activeQueueSet.add(queue))
进行了有缺陷的健全性检查,但正如您从文档中可以看到的那样,它是一个O(n)操作,即遍历了整个集合,它以某种方式错误地解释了状态列表很多次。我正在寻找一个万无一失的理智检查。
答案 0 :(得分:1)
确实,您的ConcurrentSkipListSet.add(element)
可以返回true
或false
,具体取决于该集合是否被另一个使用迭代器的线程同时修改,这里是 {{3 ,或者是非原子的批量方法(即xxxAll()
)。
请注意add()
和remove()
方法是线程安全的,因此只要您使用 修改您的设置,就可以了。
这将取决于您的具体应用程序如何处理它。如果元素不在那里,但是添加了,那就好了。如果元素首先存在并且因此没有添加,那么它是如此糟糕吗?
您可以使用非常受控制的API设计一个包含(或可能扩展)ConcurrentSkipListSet
的类,以防止任何有问题的操作或使用锁使其线程安全。