11 ArrayBlockingQueue

jdk 基于 8 版本

在平时的开发中,我们可能会用到 ArrayBlockingQueue, 它是基于循环数组来实现的,是并发安全的。

使用方式

1
2
3
4
5
6
7
8
9
public class ArrayBlockingQueueTest {

    @Test
    void test() {
        BlockingQueue<String> queue = new ArrayBlockingQueue<>(10);
        queue.offer("1");
        assertThat(queue.poll()).isEqualTo("1");
    }
}

offer

添加元素,依赖锁来保证并发安全。

源码位置: java.util.concurrent.ArrayBlockingQueue#offer(E)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
public boolean offer(E e) {
    checkNotNull(e);
    final ReentrantLock lock = this.lock;
    // 加锁
    lock.lock();
    try {
        if (count == items.length)
            return false;
        else {
            // 添加到队列尾部
            enqueue(e);
            return true;
        }
    } finally {
        // 解锁
        lock.unlock();
    }
}

poll

移除元素,依赖锁来保证并发安全。

源码位置: java.util.concurrent.ArrayBlockingQueue#poll()

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
public E poll() {
    final ReentrantLock lock = this.lock;
    // 加锁
    lock.lock();
    try {
        // 移除队列头部
        return (count == 0) ? null : dequeue();
    } finally {
        // 解锁
        lock.unlock();
    }
}
0%