|
|
51CTO旗下网站
|
|
移动端

1.7.8 线程安全容器

《Java多线程与Socket:实战微服务框架》第1章多线程基础,本书尽量采用简要和通俗易懂的方式来介绍多线程知识。本节为大家介绍线程安全容器。

作者:庞永华来源:电子工业出版社|2019-03-26 16:01

【大咖·来了 第7期】10月24日晚8点观看《智能导购对话机器人实践》

1.7.8 线程安全容器

Java中的Map、List、Set、Queue、Stack等都属于容器类。普通的容器类,如HashSet、ArrayList并不是线程安全的。要保证线程安全,就需要使用synchronized或Lock来提供的锁机制,或者使用CAS操作、volatile等线程同步手段。

Java 5以前的线程安全容器主要使用synchronized关键字来同步,我们将它们归纳为一类,统称为“同步容器”,比如Vector、Hashtable和SynchronizedList等。此外,Collections工具类提供了一些方法,可以将普通的容器对象转换为同步容器对象,例如:

. static<T> Collection<T> synchronizedCollection(Collection<T> c);

. static<T> List<T> synchronizedList(List<T> list);

. static<T> Set<T> synchronizedSet(Set<T> s);

. static<K,V> Map<K,V> synchronizedMap(Map<K,V> m);

. static<T> SortedSet<T> synchronizedSortedSet(SortedSet<T>s);

. static<K,V> SortedMap<K,V> synchronizedSortedMap(SortedMap<K,V> m);

同步容器实现线程安全的方式通常是,以容器自身对象为锁,在需要同步的方法或代码块上加上关键字synchronized,将对容器方法的并发调用变为串行执行。另外,对同步容器的操作不一定都是线程安全的。一些复合操作,比如“若没有则添加”、“若相等则移除”、“若相等则替换”、“迭代”及“获取或删除***一个元素”等操作,仍然需要开发人员增加额外的锁控制。

自Java 5开始的java.util.concurrent包提供了很多专门针对多线程环境而设计的容器。通过综合应用Lock锁、CAS操作、信号量等线程同步手段,在实现了线程安全容器的同时,极大地提升了并发性能和吞吐量,例如:

. ConcurrentHashMap<K, V>

这是线程安全的map,支持常见的复合操作,用于代替Vector和Hashtable。与Hashtable只有一个锁的实现不同,ConcurrentHashMap将自身存储空间划分成若干个段(segment),并在每个分段上各应用一个锁(ReentrantLock)。这样做既减少了锁的争用,也允许一定数量的读线程和写线程并发地访问,从而提高了并发能力。

. CopyOnWriteArrayList<E>/CopyOnWriteArraySet<E>

CopyOnWrite的核心思想是利用高并发时往往读多写少的特性,对读操作不加锁;而在写操时,先复制一份新的集合,在新的集合上面修改,***用新集合替换旧集合。

CopyOnWriteArraySet是基于CopyOnWriteArrayList实现的。不同的是,它在add时调用的是CopyOnWriteArrayList的addIfAbsent()方法,其遍历当前Object数组。如Object数组中已有了当前元素,则直接返回;反之则放到Object数组的尾部后返回。

. ConcurrentSkipListMap<K, V>/ConcurrentSkipListSet<E>

这两个类分别是并发版的TreeMap和TreeSet。Skip List(跳表)是一种可以代替平衡树的数据结构。其通过一种“空间换取时间”的算法,实现了线程安全的排序映射表,效率很高。其理论上能够在O(log(n))时间内完成查找、插入、删除操作。

. ConcurrentLinkedQueue/ConcurrentLinkedDeque

基于链表实现的非阻塞式并发队列/双端队列。

BlockingQueue/BlockingDeque

这是阻塞式并发队列接口,提供可阻塞的插入(put)和获取(take)等方法。在调用put()时,如果队列已满,将阻塞当前线程,直到队列有空间。在调用take()时,如果队列为空,则阻塞当前线程,直到队列不为空。常见的实现如下:

. LinkedBlockingQueue/ LinkedBlockingDeque

. ArrayBlockingQueue

. PriorityBlockingQueue


喜欢的朋友可以加入官方的读书群

51CTO读书频道二维码


51CTO读书会第9群:808517103

【责任编辑:book TEL:(010)68476606】

回书目   上一节   下一节
点赞 0
分享:
大家都在看
猜你喜欢

订阅专栏+更多

16招轻松掌握PPT技巧

16招轻松掌握PPT技巧

GET职场加薪技能
共16章 | 晒书包

289人订阅学习

20个局域网建设改造案例

20个局域网建设改造案例

网络搭建技巧
共20章 | 捷哥CCIE

645人订阅学习

WOT2019全球人工智能技术峰会

WOT2019全球人工智能技术峰会

通用技术、应用领域、企业赋能三大章节,13大技术专场,60+国内外一线人工智能精英大咖站台,分享人工智能的平台工具、算法模型、语音视觉等技术主题,助力人工智能落地。
共50章 | WOT峰会

0人订阅学习

读 书 +更多

Microsoft SQL Server 2005技术内幕:存储引擎

本书是Inside Microsoft SQL Server 2000的作者Kalen Delaney的又一经典著作,是Inside Microsoft SQL Server 2005系列四本著作中的一本。...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊

51CTO服务号

51CTO播客