Java并发-JDK并发容器
并发编程中,会使用到容器类。JDK本身提供了一些常用且基础的容器类,很有必要了解一下。
# 旧时代的同步容器
在Java 1.5之前,现场安全的容器类比较有效,性能方面也差强人意,但我们还是要了解一下。
- Vector。现场安全的ArrayList,所有方法都用synchronized修饰,达到线程安全的目的
- HashTable。现场安全的HashMap,所有方法都用synchronized修饰,达到线程安全的目的
- Collections.synchronizedXxx工厂方法。返回的容器类内部使用synchronized关键字实现线程安全
# 新时代的并发容器
Java 1.5之后,利用CAS指令(乐观锁)提供了更高效的并发容器。
- ConcurrentLinkedQueue。高并发环境下性能最好的队列
- CopyOnWriteArrayList。只在写时加锁的ArrayList,采用写时复制的思想,读性能大幅提升
- BlockingQueue。一个阻塞式的数据共享通道,参考:阻塞队列BlockingQueue。他有三个主要实现:
- ArrayBlockingQueue。数组支持的有界队列
- LinkedBlockingQueue。链表支持的可选有界队列
- LinkedBlockingDeque。链表支持的双向可选有界队列
- ConcurrentMap。线程安全的map,主要实现有:
- ConcurrentHashMap。高并发哈希表
- ConcurrentSkipListMap。跳表,类似LinkedHashMap,提供有序的遍历。类似于平衡树,特点是插入和删除只需要对局部数据进行操作即可。平衡树的话需要全局锁,而跳表只需要部分锁。
具体的实现细节就不展开了,这里提一下并发容器中的一些思想。
- ConcurrentHashMap。利用了分而治之的思想,使用到了分离锁。也就是把集合分为多个段,多每个段加锁,这样大大提高了性能
- CopyOnWriteArrayList。采用了写时复制的思想,也就是修改他的时候会发布一个新的容器,而读到时候不加锁。在迭代频率远高于容器修改时,性能大大增强
# 分布式集合
分布式环境下要使用集合,可以考虑Redisson (opens new window)。
我在Java集合文章中有所介绍,请移步查看。
# 总结
工欲善其事,必先利其器。新时代的Java并发容器能较好且安全的解决多线程并发问题,需要好好的掌握他!
祝你变得更强!
编辑 (opens new window)
上次更新: 2023/06/14