【问题标题】:Difference between SynchronousQueue vs TransferQueueSynchronousQueue 与 TransferQueue 之间的区别
【发布时间】:2014-11-30 21:53:39
【问题描述】:

这两种实现有什么区别?在哪些情况下应该一个接一个地使用?

【问题讨论】:

    标签: java concurrency queue producer-consumer


    【解决方案1】:

    this post by Alex Miller中所述

    TransferQueue 比 SynchronousQueue 更通用和有用,但是因为它允许您灵活地决定是否使用 normal BlockingQueue 语义或有保证的切换。在这种情况下 项目已经在队列中,调用 transfer 将保证 所有现有队列项目将在转移之前处理 项目。

    SynchronousQueue 实现使用双队列(用于等待的生产者和等待的消费者)并使用 单锁。 LinkedTransferQueue 实现使用 CAS 操作以形成一个非阻塞实现,即在 避免序列化瓶颈的核心。

    【讨论】:

    • 非自己创作的内容不要忘记引用原作者,否则视为抄袭
    【解决方案2】:

    Hemz 的回答中没有提到更重要的一点。

    来自 Alex Miller 的 puredanger.github.io

    BlockingQueue 表达了队列的概念:

    1. 生产者在将项目添加到队列时可以阻塞,直到有 可用空间。

    2. 消费者可以在从队列中移除一个项目时阻塞,直到一个 项目存在。

    TransferQueue 更进一步并阻止放置,直到该项目真正被消费者消费不仅仅是添加到队列中。这个新约束在名为transfer() 的关键新方法中表示。这个名字非常具有描述性——因为阻塞发生在从一个线程到另一个线程的切换完成之前,您实际上是在线程之间传输项目(以一种在 Java 内存模型中正确创建先发生关系的方式)。

    来自baeldung.com

    实现实际上类似于 BlockingQueue——但是 为我们提供了实现一种背压形式的新能力。这 意味着,当生产者向消费者发送消息时,使用 transfer() 方法,生产者将保持阻塞状态,直到 消息被消费。

    TransferQueue 在我们不需要时非常有用 生产过剩的生产者会用消息淹没队列, 导致 OutOfMemory 错误。在这样的设计中,消费者会 决定生产者生成消息的速度。

    来自howtodoinjava.com

    当生产者到达 TransferQueue 传输消息并且 有消费者等待取消息,然后直接生产者 将消息传递给消费者。

    如果没有消费者等待,那么生产者不会直接放 消息并返回,而是等待任何消费者 可用于消费消息。

    其他要点:

    来源:puredanger.github.io

    还包括其他几种方法:tryTransfer() 的两种形式,它们执行传输,但要么是非阻塞的(仅在可以立即完成的情况下传输),要么是超时的。还有一些辅助方法hasWaitingConsumer()getWaitingConsumerCount()

    TransferQueueSynchronousQueue 更通用和有用,但是因为它允许您灵活地决定是使用普通的BlockingQueue 语义还是保证切换。在物品已经在队列中的情况下,调用 transfer 将保证所有现有的队列物品都会在被转移的物品之前被处理。

    William Scherer、Doug Lea 和 Michael Scott 的一篇论文阐述了 LinkedTransferQueue 算法和性能测试,展示了它们对现有 Java 5 替代方案的改进。 LinkedTransferQueue 在不公平模式下比 SynchronousQueue 性能高出 3 倍,在公平模式下高出 14 倍。

    Doug Lea 说,在能力方面,LinkedTransferQueue 实际上是ConcurrentLinkedQueueSynchronousQueue(在“公平”模式下)和无限LinkedBlockingQueues 的超集。通过允许您混合和匹配这些功能以及利用更高性能的实施技术,它变得更好。

    【讨论】:

    • 这个解释的很好,参考资料也足够了。
    猜你喜欢
    • 2011-11-11
    • 2019-04-09
    • 2014-10-30
    • 2021-12-07
    • 2016-02-09
    • 2016-05-14
    • 2016-10-11
    • 2015-06-02
    • 2018-04-08
    相关资源
    最近更新 更多