use*_*577 9 java concurrency blockingqueue
我正在浏览ArrayBlockingQueue和LinkedBlockingQueue的源代码.LinkedBlockingQueue有一个putLock和一个takeLock分别用于插入和删除,但ArrayBlockingQueue只使用1个锁.我相信LinkedBlockingQueue是基于简单,快速,实用的非阻塞和阻塞并发队列算法中描述的设计实现的.在本文中,他们提到他们保留一个虚拟节点,以便入队者永远不必访问头部,并且出队员永远不必访问尾部,这避免了死锁情况.我想知道为什么ArrayBlockingQueue没有借用相同的想法而是使用2个锁.
ArrayBlockingQueue必须避免覆盖条目,以便它需要知道开始和结束的位置.LinkedBlockQueue不需要知道这一点,因为它让GC担心清理队列中的节点.
我想知道为什么ArrayBlockingQueue没有借用相同的想法而是使用2个锁.
因为ArrayBlockingQueue使用更简单的数据结构来保存队列项.
的ArrayBlockingQueue存储其内的一个数据private final E[] items;阵列.对于处理相同存储空间的多个线程,无论是添加还是出列,它们都必须使用相同的锁.这不仅是因为内存屏障,而且因为它们正在修改同一个数组,因此会受到互斥保护.
LinkedBlockingQueue另一方面,队列元素的链接列表完全不同,并且允许具有双重锁定的能力.它是队列中元素的内部存储,启用了不同的锁配置.
| 归档时间: |
|
| 查看次数: |
3595 次 |
| 最近记录: |