java.util.concurrent - 队列Queue

0、阻塞队列 - BlockingQueue

是一个接口,以下Queue都是其实现类

通常用于一个线程生产对象,而另一个线程消费对象的场景。

阻塞体现在两个方面,一是生产对象,在队列中的对象达到临界点后,生产者再生产出的对象不会被放入队列中,表示生产者进入阻塞状态,直到有消费者消费了对象;二是体现在当队列中的对象被消费完毕后,消费者再次进行消费时,会进入阻塞队列,直到有生产者生产了对象。

1、数组阻塞队列 - ArrayBlockingQueue

有界的阻塞队列,内部实现是数组(容量一旦初始化,无法修改)。

内部以FIFO的顺序对元素进行存储,即队列的头元素是存储时间最长的,队列的尾元素是存储时间最短的。

默认不保证访问者的公平性。公平性是指阻塞的生产者线程或消费者线程可以按照阻塞的先后顺序访问队列

2、链阻塞队列 - LinkedBlockingQueue

有界的阻塞队列,内部实现是链表结构,可以设定上限,若没有设定,使用默认Integer.MAX_VALUE

内部以FIFO的顺序对元素进行存储

3、具有优先级的阻塞队列 - PriorityBlockingQueue

无界的并发队列,不允许插入null,插入元素必须实现java.lang.Comparable接口。因此队列中的元素的排序取决于Comparable实现

4、延迟队列- DelayQueue

存入该队列中的元素(必须实现Delayed接口)有一个延迟期,表示在延迟期指定的时间内不可以被消费,只有延迟期过后才可以被消费。必须实现Comparable接口,指定排序,但一般会将该队列中队头元素是延迟期满后的存在于队列时间最长的那个元素,队尾反之,存在时间最短。

应用于定时任务、缓存系统

5、同步队列 - SynchronizedQueue

一个特殊的队列,只能存放一个元素,即一个put操作后只能take操作。

该队列的吞吐量高于LinkedBlockingQueueArrayBlockingQueue

6、ArrayBlockingQueue与LinkedBlockingQueue异同点

相同点

都是阻塞式队列,使用ReentranLockCondition保证puttake元素的同步;

当队列为空时,take()被阻塞;当队列满时,put()阻塞

不同点

锁机制不同:

ArrayBlockingQueue只有一个,lock

LinkedBlockingQueue的锁有两个,putLocktakeLock         

实现机制不同:

ArrayBlockingQueue - 数组

LinkedBlockingQueue - 链表

初始容量的不同:

ArrayBlockingQueue必须传入一个指定capacity

LinkedBlockingQueue默认Integer.MAX_VALUE/传入一个指定capacity

统计容器中插入的元素个数的不同:

ArrayBlockingQueue使用int类型

LinkedBlockingQueue使用AtomicInteger对象

猜你喜欢

转载自blog.csdn.net/m0_37461645/article/details/84889586
今日推荐