为什么LinkedBlockingQueue在内部不使用LinkedList?

时间:2019-07-10 09:01:37

标签: java java.util.concurrent

在阅读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
}

它不是像上面的代码那样实现的吗?这背后的权衡是什么?

1 个答案:

答案 0 :(得分:3)

以下是使用私有链接列表类的一些原因:

  1. LinkedBlockingQueue中使用的链接列表是一个单链接列表。 LinkedList被双重链接。这样会占用更多内存,并且性能损失较小。

  2. LinkedList提供故障快速迭代器,并使用modCount字段检测并发修改。必须在修改列表的每个列表操作上将其递增。与提供弱一致性迭代器且没有Linked BlockingQueue的{​​{1}}相比,这是一个很小的性能损失。