【问题标题】:Sanity checks on dynamic set动态集的健全性检查
【发布时间】:2016-08-03 21:26:03
【问题描述】:

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

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

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

【问题讨论】:

  • 我不清楚你在问什么。 size 不是常数时间操作这一事实与检查 add 方法是否返回正确的值有什么关系?

标签: java concurrency queue sanity-check


【解决方案1】:

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

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

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

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

【讨论】:

  • 它并没有那么糟糕,而且很少发生,但仍然是需要解决的问题。我想你的扩展想法会奏效。
猜你喜欢
  • 2011-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-24
  • 2015-04-10
相关资源
最近更新 更多