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所不具备的
网友评论