为什么ConcurrentLinkedQueue.size()的复杂度不能恒定?

时间:2019-09-05 22:53:38

标签: java multithreading concurrency nonblocking concurrent-queue

Javadoc for ConcurrentLinkedQueue明确指出size()方法的复杂度为O(n)。我觉得这很奇怪。我将通过在柜台中累积大小来遵循股票DefaultMixedRealityToolkitConfigurationProfile方法。考虑到LinkedList.size()操作的异步性质,自然地,计数器将必须为ConcurrentLinkedQueue。这样做是否会因为违反无障碍保证而没有做到?如果是这样,我期望AtomicInteger计数器会带来多少开销?

1 个答案:

答案 0 :(得分:3)

AtomicInteger没什么问题:在非阻塞环境中使用是一件好事。但是,如果在队列中添加了AtomicInteger计数器,则会引入pool()offer(E)都必须保持更新的位置。这将增加CAS操作的数量以及失败 CAS操作的数量。

Javadoc告诉我们,减少CASes可能是一个很好的优化。

  

头和尾都允许滞后。实际上,每次都无法更新都是一个重大的优化(较少的CASes)。
  ...
  由于头和尾同时并独立地更新,所以尾有可能落后于头(为什么不这样)?

     

JDK 8 > java.util.concurrent.ConcurrentLinkedQueue

请注意,size()返回的结果可能不准确,并且如他们所说,“在并发应用程序中通常不是很有用”。