Javadoc for ConcurrentLinkedQueue
明确指出size()方法的复杂度为O(n)。我觉得这很奇怪。我将通过在柜台中累积大小来遵循股票DefaultMixedRealityToolkitConfigurationProfile
方法。考虑到LinkedList.size()
操作的异步性质,自然地,计数器将必须为ConcurrentLinkedQueue
。这样做是否会因为违反无障碍保证而没有做到?如果是这样,我期望AtomicInteger
计数器会带来多少开销?
答案 0 :(得分:3)
AtomicInteger
没什么问题:在非阻塞环境中使用是一件好事。但是,如果在队列中添加了AtomicInteger
计数器,则会引入pool()
和offer(E)
都必须保持更新的位置。这将增加CAS操作的数量以及失败 CAS操作的数量。
Javadoc告诉我们,减少CASes可能是一个很好的优化。
头和尾都允许滞后。实际上,每次都无法更新都是一个重大的优化(较少的CASes)。
...
由于头和尾同时并独立地更新,所以尾有可能落后于头(为什么不这样)?
请注意,size()
返回的结果可能不准确,并且如他们所说,“在并发应用程序中通常不是很有用”。