同步队列与交换器

2022-09-03 15:08:15

交换器和同步队列有什么区别?以及可以使用它们中的每一个的场景?哪一个性能更好?(锁定明智?


答案 1

An 更像是一种纯同步机制,而 a 则额外提供标准队列数据结构的所有操作。这意味着,例如,您可以检查队列中的对象,通过异步从队列中删除项目来取消已计划但尚未执行的操作等 - 这些操作不提供。由于许多实现允许设置队列大小的限制,因此您可以对资源使用情况进行额外的控制,并且可以在队列增长到超过特定阈值时丢弃请求。另一方面,提供开箱即用的双向通信,而单个队列只是一种方式(尽管可以手动实现另一个方向的通信)。由于许多实际情况只需要生产者 - 消费者关系,因此队列通常更好,因为上面列出的API和附加操作更容易理解。ExchangerSynchronousQueueExchangerExchanger

本文介绍 的一个实际用例。它们专注于在线程之间通信时能够避免创建和垃圾回收新对象(根据实现,队列可能会在您向它们追加某些内容时分配条目)。性能可能取决于您的特定用例。在示例中,它们用于提高效率(避免垃圾回收),但在大多数情况下(如果您不必提供亚毫秒级延迟),分配一个或两个对象并不是一个大问题,我更喜欢使用队列进行它允许的额外控制。ExchangerExchanger

编辑:我在Oracle JDK中检查了源代码,它确实在.因此,似乎与链接文章的作者所陈述的相反,它不是免分配的。两者都不是(很明显)。相反,当项目追加到某个临时对象时,它不会分配任何临时对象。它只分配一个数组来保存创建时允许的最大元素数,但这只是一次性操作。在使用过程中,它不会创建新对象,因此从纯GC的角度来看,它应该比.Exchanger.javaExchanger.NodeExchanger.doExchange()ExchangerLinkedBlockingQueueArrayBlockingQueueExchanger


答案 2

让我们把重点放在关键点上。

  • 交换器:是两个线程可以交换对象的会合点
  • SynchQueue:是一个队列!一个线程放置并等待,直到另一个线程弹出。这里没有交换业务

交换器是一种双向同步队列


推荐