并发编程从零开始(六)-BlockingDeque+CopyOnWrite

并发编程从零开始(六)-BlockingDeque+CopyOnWrite

5.2 BlockingDeque

BlockingDeque定义了一个阻塞的双端队列接口:

并发编程从零开始(六)-BlockingDeque+CopyOnWrite

该接口继承了BlockingQueue接口,同时增加了对应的双端队列操作接口。该接口只有一个实现,就是LinkedBlockingDeque,其核心数据结构如下所示,是一个双向链表。

并发编程从零开始(六)-BlockingDeque+CopyOnWrite

对应的实现原理,和LinkedBlockingQueue基本一样,只是LinkedBlockingQueue是单向链表,而LinkedBlockingDeque是双向链表。


5.3 CopyOnWrite

CopyOnWrite指在“写”的时候,不是直接“写”源数据,而是把数据拷贝一份进行修改,再通过悲观锁或者乐观锁的方式写回。那为什么不直接修改,而是要拷贝一份修改呢?这是为了在“读”的时候不加锁,典型的空间换时间。

5.3.1 CopyOnWriteArrayList

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

并发编程从零开始(六)-BlockingDeque+CopyOnWrite

读取数据的方法有:

并发编程从零开始(六)-BlockingDeque+CopyOnWrite

所有读的方法都没有加锁,但是所有的修改操作都加了锁。

并发编程从零开始(六)-BlockingDeque+CopyOnWrite

并发编程从零开始(六)-BlockingDeque+CopyOnWrite

其他修改方法,例如remove和add类似,此处不再详述。

5.3.2 CopyOnWriteArraySet

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

并发编程从零开始(六)-BlockingDeque+CopyOnWrite

上一篇:flask-bootstrap学习笔记


下一篇:Java并发44:并发集合系列-基于写时复制的CopyOnWriteArrayList和CopyOnWriteArraySet