并发编程:并发容器,我们一起了解一下!

开发 前端
在所有的并发容器中,BlockingQueue是最常见的一种。BlockingQueue是一个带阻塞功能的队列,当入队列时,若队列已满,则阻塞调用者;当出队列时,若队列为空,则阻塞调用者。

一、BlockingQueue

在所有的并发容器中,BlockingQueue是最常见的一种。BlockingQueue是一个带阻塞功能的队列,当入队列时,若队列已满,则阻塞调用者;当出队列时,若队列为空,则阻塞调用者。

在Concurrent包中,BlockingQueue是一个接口,有许多个不同的实现类,如图所示。

1、ArrayBlockingQueue是一个用数组实现的环形队列,在构造方法中,会要求传入数组的容量。

2、LinkedBlockingQueue是一种基于单向链表的阻塞队列。因为队头和队尾是2个指针分开操作的, 所以用了2把锁+2个条件,同时有1个AtomicInteger的原子变量记录count数。

3、PriorityBlockingQueue 队列通常是先进先出的,而PriorityQueue是按照元素的优先级从小到大出队列的。正因为如此, PriorityQueue中的2个元素之间需要可以比较大小,并实现Comparable接口。

4、DelayQueue即延迟队列,也就是一个按延迟时间从小到大出队的PriorityQueue。所谓延迟时间, 就是“未来将要执行的时间”减去“当前时间”。为此,放入DelayQueue中的元素,必须实现Delayed接 口。

5、SynchronousQueue是一种特殊的BlockingQueue,它本身没有容量。先调put(...),线程会阻塞; 直到另外一个线程调用了take(),两个线程才同时解锁,反之亦然。对于多个线程而言,例如3个线程, 调用3次put(...),3个线程都会阻塞;直到另外的线程调用3次take(),6个线程才同时解锁,反之亦然。

二、BlockingDeque

BlockingDeque定义了一个阻塞的双端队列接口,如下所示。

该接口继承了BlockingQueue接口,同时增加了对应的双端队列操作接口。该接口只有一个实现, 就是LinkedBlockingDeque。

三、CopyOnWrite

CopyOnWrite指在“写”的时候,不是直接“写”源数据,而是把数据拷贝一份进行修改,再通过悲观锁或者乐观锁的方式写回。

那为什么不直接修改,而是要拷贝一份修改呢? 这是为了在“读”的时候不加锁。

1、CopyOnWriteArrayList

和ArrayList一样,CopyOnWriteArrayList的核心数据结构也是一个数组。

2、CopyOnWriteArraySet

CopyOnWriteArraySet 就是用 Array 实现的一个 Set,保证所有元素都不重复。其内部是封装的一 个CopyOnWriteArrayList。

责任编辑:武晓燕 来源: 今日头条
相关推荐

2023-07-11 08:34:25

参数流程类型

2024-05-28 00:00:03

Java垃圾收集机制

2021-07-27 18:03:59

iOSSwift调度器

2023-07-04 13:36:00

同步工具类Phaser

2021-10-27 07:15:37

SpringAOP编程(

2022-05-07 07:43:07

Redis存储系统数据库

2020-07-23 07:51:51

Python编程语言工具

2021-07-14 08:00:12

Numa架构Linux

2021-11-29 07:24:08

ACID事务大数据

2017-11-15 08:50:59

数据库MySQL

2023-08-10 08:28:46

网络编程通信

2010-04-01 13:58:16

WinCE 6.0Cashmere

2024-07-26 09:47:28

2023-06-05 14:14:21

腾讯索引面试

2024-01-30 09:14:35

容器资源管理

2022-07-20 08:55:10

编辑器VueTiptap

2024-05-27 00:00:00

AmpPHP非阻塞

2022-12-09 08:34:38

嵌入式Web容器

2023-07-04 08:06:40

数据库容器公有云

2023-07-03 09:59:00

并发编程并发容器
点赞
收藏

51CTO技术栈公众号