看关键字Concurrent就知道这个两个类是并发类。
ConcurrentLinkedQueue 是单向链表结构的无界并发队列。元素操作按照 FIFO (first-in-first-out 先入先出) 的顺序。适合“单生产,多消费”的场景。内存一致性遵循对ConcurrentLinkedQueue的插入操作先行发生于(happen-before)访问或移除操作。
ConcurrentLinkedDeque 是双向链表结构的无界并发队列。与 ConcurrentLinkedQueue 的区别是该阻塞队列同时支持FIFO和FILO两种操作方式,即可以从队列的头和尾同时操作(插入/删除)。适合“多生产,多消费”的场景。内存一致性遵循对 ConcurrentLinkedDeque 的插入操作先行发生于(happen-before)访问或移除操作
两者都是从JDK1.7开始加入到J.U.C的行列中。使用CAS实现并发安全!他们的非阻塞算法基本一致,ConcurrentLinkedDeque 只是为双端操作定义了几个可供操作的节点类型。
这里我们介绍ConcurrentLinkedDeque 的常用用法就行,ConcurrentLinkedQueue 的用法类似。
一般说到集合常用的功能无非就是增删查:
增加一个元素:public boolean add(E e) {}
增加一个集合: public boolean addAll(Collection<? extends E> c) {}
删除一个元素: public boolean remove(Object o) {}
获取一个节点元素:peek、peekFirst 、peekLast、getFirst、getLast
,都是通过peekFirst 、peekLast
实现。
更强大的功能特性:
获取并移除节点: poll、pop、remove、pollFirst、pollLast、removeFirst、removeLast
,都是通过pollFirst、pollLast
实现。
pollFirst()和pollLast()和
remove(Object o) 比较常用
由于ConcurrentLinkedDeque 是双向队列,你可以随时添加集合到队列中,用pollFirst()和pollLast()来消费队列。从消费速度上肯定要比
ConcurrentLinkedQueue 消费的快。