在阅读LinkedBlockingQueue
的源代码时,我注意到它使用了ReentrantLock
的链表。但是由于Java已经有一个名为LinkedList
的实现,为什么不直接在LinkedBlockingQueue
中使用它呢?同样,在LinkedBlockingDeque
中再次实现了链表。
public class LinkedBlockingDeque<E> extends AbstractQueue<E>
implements BlockingDeque<E>, java.io.Serializable {
private LinkedList<E> queue;
final ReentrantLock lock = new ReentrantLock();
// take the remove(Object) method as example
public boolean remove(Object o) {
if (o == null) return false;
fullyLock();
try {
queue.remove(o);
return false;
} finally {
fullyUnlock();
}
}
// ... the rest of the class
}
它不是像上面的代码那样实现的吗?这背后的权衡是什么?
答案 0 :(得分:3)
以下是使用私有链接列表类的一些原因:
在LinkedBlockingQueue
中使用的链接列表是一个单链接列表。 LinkedList
被双重链接。这样会占用更多内存,并且性能损失较小。
LinkedList
提供故障快速迭代器,并使用modCount
字段检测并发修改。必须在修改列表的每个列表操作上将其递增。与提供弱一致性迭代器且没有Linked BlockingQueue
的{{1}}相比,这是一个很小的性能损失。