SynchronousQueue与Exchanger

Hem*_*shu 14 java concurrency

什么是Exchanger和SynchronousQueue之间的区别?以及可以使用它们的场景?哪一个表现更好?(顺便说一句?)

Mic*_*ski 10

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

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

编辑:我检查了源Exchanger.java中的Oracle JDK和它创建类的临时对象Exchanger.NodeExchanger.doExchange().因此,似乎与链接文章的作者所说的相反,Exchanger不是免费分配.两者都不是(相当明显)LinkedBlockingQueue.的ArrayBlockingQueue,与此相反,不当一个项目被附加到其分配任何临时对象.它只分配一个数组来保存创建时允许的最大元素数,但这只是一次性操作.在使用过程中,它不会创建新对象,因此从纯GC的角度来看它应该更好Exchanger.

  • @PeterLawrey我检查了`Exchanger.java`的源代码,它确实在``Exchanger.doExchange()中创建了``Exchanger.Node`类的临时对象` (3认同)