对动态集进行健全性检查
Sanity checks on dynamic set
我在 Java
中有一个由 ConcurrentSkipListSet 创建的对象 QueueSet
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)
确实可以 return true
或 false
取决于集合是否被另一个使用迭代器的线程同时修改,这里是 ,或通过非原子的批量方法(即 xxxAll()
)。
不过请注意 add()
和 remove()
方法是线程安全的,因此只要您使用 only 修改您的集合就可以了.
如何处理取决于您的具体应用。如果该元素不存在,但已添加,那很好。如果该元素一开始就存在,因此没有添加,会不会很糟糕?
您可以设计一个 class 包含(或可能扩展)ConcurrentSkipListSet
并且非常可控 API 防止任何有问题的操作或通过使用锁使它们线程安全。
我在 Java
中有一个由 ConcurrentSkipListSet 创建的对象 QueueSetBeware 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)
确实可以 return true
或 false
取决于集合是否被另一个使用迭代器的线程同时修改,这里是xxxAll()
)。
不过请注意 add()
和 remove()
方法是线程安全的,因此只要您使用 only 修改您的集合就可以了.
如何处理取决于您的具体应用。如果该元素不存在,但已添加,那很好。如果该元素一开始就存在,因此没有添加,会不会很糟糕?
您可以设计一个 class 包含(或可能扩展)ConcurrentSkipListSet
并且非常可控 API 防止任何有问题的操作或通过使用锁使它们线程安全。