【问题标题】:Why can't complexity of ConcurrentLinkedQueue.size() be constant?为什么 ConcurrentLinkedQueue.size() 的复杂性不能保持不变?
【发布时间】:2020-01-08 20:22:11
【问题描述】:

Javadoc for ConcurrentLinkedQueue 明确指出 size() 方法的复杂度为 O(n)。我觉得这很令人惊讶。我会按照股票LinkedList.size() 的方法,在柜台累积大小。鉴于ConcurrentLinkedQueue 操作的异步性质,计数器自然必须是AtomicInteger。这样做是不是因为它会违反非阻塞保证?如果是这样,我应该期望AtomicInteger 计数器引入多少开销?

【问题讨论】:

    标签: java multithreading concurrency nonblocking concurrent-queue


    【解决方案1】:

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

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

    头部和尾部都允许滞后。事实上,每次都不能更新它们是一项重要的优化(更少的 CAS)。
    ...
    由于 head 和 tail 是同时独立更新的,tail 有可能落后于 head(为什么不)?

    JDK 8 > java.util.concurrent.ConcurrentLinkedQueue

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

    【讨论】:

    • 感谢您的回复,安德鲁。假设您在突出显示的部分中引用,您能否提供链接或参考?
    • 谢谢,安德鲁。这有帮助。
    猜你喜欢
    • 2019-09-19
    • 2013-04-22
    • 2018-06-11
    • 2018-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-22
    相关资源
    最近更新 更多