📜  ArrayBlockingQueue 和 LinkedBlockingQueue 的区别(1)

📅  最后修改于: 2023-12-03 15:13:29.827000             🧑  作者: Mango

ArrayBlockingQueue 和 LinkedBlockingQueue 的区别

ArrayBlockingQueueLinkedBlockingQueue 是 Java 中提供的两种阻塞队列,它们都是线程安全的,但在实现原理和使用场景上有所不同。

ArrayBlockingQueue

ArrayBlockingQueue 类是一个基于数组结构实现的有界阻塞队列,其大小在创建时就确定了。当队列满时,添加元素的操作会被阻塞;当队列为空时,取出元素的操作会被阻塞。

    public ArrayBlockingQueue(int capacity) {
        this(capacity, false);
    }

    public ArrayBlockingQueue(int capacity, boolean fair) {
        if (capacity <= 0)
            throw new IllegalArgumentException();
        this.items = new Object[capacity];
        lock = new ReentrantLock(fair);
        notEmpty = lock.newCondition();
        notFull =  lock.newCondition();
    }

ArrayBlockingQueue 内部使用了 ReentrantLock 和 Condition 来保证线程安全和阻塞机制。

LinkedBlockingQueue

LinkedBlockingQueue 类是一个基于链表结构实现的有界或无界阻塞队列,默认情况下大小是无限的。当队列空时,获取元素的操作会被阻塞;当队列满时,添加元素的操作会被阻塞。

    public LinkedBlockingQueue() {
        this(Integer.MAX_VALUE);
    }

    public LinkedBlockingQueue(int capacity) {
        if (capacity <= 0) throw new IllegalArgumentException();
        this.capacity = capacity;
        last = head = new Node<E>(null);
    }

LinkedBlockingQueue 也使用了 ReentrantLock 和 Condition 来保证线程安全和阻塞机制。

区别
  • ArrayBlockingQueue 是一个基于数组的阻塞队列,因此其大小是有界的,而 LinkedBlockingQueue 是一个基于链表的阻塞队列,大小可以选择有界也可以选择无界。
  • ArrayBlockingQueue 内部使用了可重入锁和条件变量来实现阻塞队列,而 LinkedBlockingQueue 内部使用了锁和条件变量来实现阻塞队列。
  • 由于 ArrayBlockingQueueLinkedBlockingQueue 使用了不同的实现方式,因此它们的性能表现也不同。在高并发场景下,LinkedBlockingQueue 可能会更好一些,而在低并发场景下,ArrayBlockingQueue 的性能则更高。

综上所述,ArrayBlockingQueueLinkedBlockingQueue 都是线程安全的阻塞队列,但在实现原理、大小限制和性能表现上有所不同。根据实际需求,选择合适的阻塞队列可以使程序更加高效稳定。