基础知识学习

常用容器对象

2022-04-07  本文已影响0人  jxcyly1985

SynchronousQueue

SynchronousQueue为什么不设置成capacity空间大小是1的LinkedBlockingQueue?

1、capacity是1不符合SynchronousQueue的定义要求,SynchronousQueue的空间是0
只有当存在消费者的时候,即存在 <take>操作时候,offer才能成功

2、如果capacity空间设置成0, LinkedBlockingQueue的capacity不能设置成0,不符合LinkedBlockingQueue的定义,LinkedBlockingQueue的空间大小必须大于0

3、SynchronousQueue特点是,当没有consumer端时,offer会失败,这也就是说如果前一个produce的产品没有消费掉,则不能放入新的产品。同样,当没有producer放入产品,consumer端会一直等待。

LinkedTransferQueue

为什么有SynchronousQueue,还需要LinkedTransferQueue?
LinkedTransferQueue为什么不能用capacity大小是Integer.MAX_VALUE的LinkedBlockingQueue代替?

1、对比SynchronousQueue生产端,put是block方式的,而LinkedTransferQueue是无界容器,producer端可以立即放入返回。

2、LinkedBlockingQueue的take是堵塞算法,在take的时候需要同步加锁,而LinkedTransferQueue是基于非堵塞算法实现,在可伸缩性上优于LinkedBlockingQueue

3、LinkedTransferQueue实现了TransferQueue接口,因此可以通过public abstract void transfer (E e)接口等待接收,这个能力是LinkedBlockingQueue所不具备的

上一篇下一篇

猜你喜欢

热点阅读