同步容器、并发容器、阻塞队列、双端队列

一、同步容器

主要代表有Vector和Hashtable,以及Collections.synchronizedXxx等。

锁的粒度为当前对象整体。

迭代器是及时失败的,即在迭代的过程中发现被修改,就会抛出ConcurrentModificationException。

二、并发容器

主要代表有ConcurrentHashMap、CopyOnWriteArrayList、ConcurrentSkipListMap、ConcurrentSkipListSet。

锁的粒度是分散的、细粒度的,即读和写是使用不同的锁。

迭代器具有弱一致性,即可以容忍并发修改,不会抛出ConcurrentModificationException。

三、阻塞队列

主要代表有LinkedBlockingQueue、ArrayBlockingQueue、PriorityBlockingQueue(Comparable,Comparator)、SynchronousQueue。

提供了可阻塞的put和take方法,以及支持定时的offer和poll方法。

适用于生产者、消费者模式(线程池和工作队列-Executor),同时也是同步容器

四、双端队列

主要代表有ArrayDeque和LinkedBlockingDeque。

意义:正如阻塞队列适用于生产者消费者模式,双端队列同样适用与另一种模式,即工作密取。在生产者-消费者设计中,所有消费者共享一个工作队列,而在工作密取中,每个消费者都有各自的双端队列。

适用于:网页爬虫等任务中

五、比较及适用场景

如果不需要阻塞队列,优先选择ConcurrentLinkedQueue;

如果需要阻塞队列,队列大小固定优先选择ArrayBlockingQueue,队列大小不固定优先选择LinkedBlockingQueue;

如果需要对队列进行排序,选择PriorityBlockingQueue;

如果需要一个快速交换的队列,选择SynchronousQueue;

如果需要对队列中的元素进行延时操作,则选择DelayQueue。

一、同步容器 主要代表有Vector和Hashtable,以及Collections.synchronizedXxx等。 锁的粒度为当前对象整体。 迭代器是及时失败的,即在迭代的过程中发现被修改,就会抛出ConcurrentModificationException。 二、并发容器 主要代表有ConcurrentHashMap、CopyOnWriteArrayList、ConcurrentSkipListMap、ConcurrentSkipListSet。 锁的粒度是分散的、细粒度的,即读和写是使用不同的锁。 迭代器具有弱一致性,即可以容忍并发修改,不会抛出ConcurrentModificationException。 三、阻塞队列 主要代表有LinkedBlockingQueue、ArrayBlockingQueue、PriorityBlockingQueue(Comparable,Comparator)、SynchronousQueue。 提供了可阻塞的put和take方法,以及支持定时的offer和poll方法。 适用于生产者、消费者模式(线程池和工作队列-Executor),同时也是同步容器 四、双端队列 主要代表有ArrayDeque和LinkedBlockingDeque。 意义:正如阻塞队列适用于生产者消费者模式,双端队列同样适用与另一种模式,即工作密取。在生产者-消费者设计中,所有消费者共享一个工作队列,而在工作密取中,每个消费者都有各自的双端队列。 适用于:网页爬虫等任务中 五、比较及适用场景 如果不需要阻塞队列,优先选择ConcurrentLinkedQueue; 如果需要阻塞队列,队列大小固定优先选择ArrayBlockingQueue,队列大小不固定优先选择LinkedBlockingQueue; 如果需要对队列进行排序,选择PriorityBlockingQueue; 如果需要一个快速交换的队列,选择SynchronousQueue; 如果需要对队列中的元素进行延时操作,则选择DelayQueue。
经验分享 程序员 微信小程序 职场和发展