5 并发容器

felix.shao2025-02-16

5 并发容器

5.1 BlockingQueue

 带阻塞功能的队列,有以下子类:

  • ArrayBlockingQueue。
  • LinkedBlockingQueue。
  • PriorityBlockingQueue。
  • DelayQueue。
  • SynchronousQueue。

 队列入队、出队方法如下。

public interface BlockingQueue<E> extends Queue<E> {
    // 队列满,抛出异常
    boolean add(E e);
    // 队列满返回 false 
    boolean offer(E e);
    // 可以被打断,很明显是阻塞式添加元素
    void put(E e) throws InterruptedException;
    
    // 队列空抛出 NoSuchElementException 
    E remove();
    // 队列空返回 null
    E peek();
    // 阻塞式出队列
    E take() throws InterruptedException;
}

5.1.1 ArrayBlockingQueue

 略。和 1 个 Lock + 2 个 Condition 的生产者消费模型基本一致。

5.1.2 LinkedBlockingQueue

 这里为了提高并发度,用 2 把锁,分别控制对头,队尾的操作。

5.1.3 PriorityBlockingQueue

 优先级队列。和 ArrayBlockingQueue 类似,实现按优先级从小到大出队列,另一个区别是没有 notFull 条件,当元素个数超出数组长度时,执行扩容操作。

5.1.4 DelayQueue

 延迟队列。底层由用到优先级队列的排序特性,按照延迟时间排序处理。

5.1.5 SynchronousQueue

 特殊的队列,不存储元素,如先调 put 时阻塞,直到另外一个线程 take 时,两个线程解锁,反之亦然。

5.2 BlockingDeque

 阻塞的双端队列接口。

5.3 CopyOnWrite

 指写的时候,是数据拷贝一份进行修改,再通过悲观锁或者乐观锁的方式写回,这样读就不需要加锁了。

5.3.1 CopyOnArrayList

 读即是通用的数据操作,写的时候加悲观锁做了复制数据操作,注意加锁时没有影响读操作。

5.3.2 CopyOnWriteArraySet

 底层还是用的 CopyOnArrayList,保证了所有元素都不重复。

5.4 ConcurrentLinkedQueue/Deque

 略。

5.5 ConcurrentHashMap

 注意下 JDK7 和 JDK8 的底层实现逻辑不一样。

5.6 ConcurrentSkipListMap/Set

 略。

5.6.1 ConcurrentSkipListMap

 略。

5.6.2 ConcurrentSkipListSet

 略。

Last Updated 2/16/2025, 4:13:06 PM