为什么 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的一些原因:

  1. LinkedBlockingQueue中使用的链表是单向链表。 LinkedList 是双向链接的。这会使用更多内存,并且性能损失很小。 (这不适用于 LinkedBlockingDeque 的情况。)

  2. LinkedList 提供 fail-fast 迭代器,并使用 modCount 字段来检测并发修改。这必须在修改列表的每个列表操作上递增。与提供弱一致性迭代器且没有 modCount.

  3. LinkedBlockingQueueLinkedBlockingDeque 相比,这是一个小的性能损失
  4. LinkedBlockingQueueLinkedBlockingDeque 设计 弱一致。如果他们要在后台使用 LinkedList,则无法隐藏后者的 fail-fast 行为......正如@Holger 指出的那样。