为什么 LinkedBlockingQueue 内部不使用 LinkedList?
Why doesn't LinkedBlockingQueue use LinkedList internally?
在阅读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
}
有什么不像上面的代码那样实现的?这背后的取舍是什么?
以下是使用私有链表class的一些原因:
LinkedBlockingQueue
中使用的链表是单向链表。 LinkedList
是双向链接的。这会使用更多内存,并且性能损失很小。 (这不适用于 LinkedBlockingDeque
的情况。)
LinkedList
提供 fail-fast 迭代器,并使用 modCount
字段来检测并发修改。这必须在修改列表的每个列表操作上递增。与提供弱一致性迭代器且没有 modCount
.
的 LinkedBlockingQueue
和 LinkedBlockingDeque
相比,这是一个小的性能损失
LinkedBlockingQueue
和 LinkedBlockingDeque
设计 弱一致。如果他们要在后台使用 LinkedList
,则无法隐藏后者的 fail-fast 行为......正如@Holger 指出的那样。
在阅读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
}
有什么不像上面的代码那样实现的?这背后的取舍是什么?
以下是使用私有链表class的一些原因:
LinkedBlockingQueue
中使用的链表是单向链表。LinkedList
是双向链接的。这会使用更多内存,并且性能损失很小。 (这不适用于LinkedBlockingDeque
的情况。)LinkedList
提供 fail-fast 迭代器,并使用modCount
字段来检测并发修改。这必须在修改列表的每个列表操作上递增。与提供弱一致性迭代器且没有modCount
. 的 LinkedBlockingQueue
和LinkedBlockingDeque
设计 弱一致。如果他们要在后台使用LinkedList
,则无法隐藏后者的 fail-fast 行为......正如@Holger 指出的那样。
LinkedBlockingQueue
和 LinkedBlockingDeque
相比,这是一个小的性能损失