JAVA并发集合有哪些?除了你熟悉的ConcurrentHashMap,还用过哪些并发集合

JAVA并发集合有哪些?除了你熟悉的ConcurrentHashMap,还用过哪些并发集合

参考文章:并发集合类_并发集合有哪些-CSDN博客

并发集合:

(1) List

` CopyOnWriteArrayList  - jdk11中是通过 synchronized关键字加锁,进行add,set,remove操作,保证线程安全

(2) Set

` CopyOnWriteArraySet - 它的底层实现就是 CopyOnWriteArrayList,通过CopyOnWriteArrayList实现,但是多了一个去重的功能。比如:addIfAbsent(), 相当于也是通过 synchronized 关键字来加锁

` ConcurrentSkipListSet:是线程安全的有序的集合(相当于线程安全的TreeSet);它继承于AbstractSet,并实现了NavigableSet接口。ConcurrentSkipListSet是通过ConcurrentSkipListMap实现的,它也支持并发。


(3) Map

` ConcurrentHashMap:是线程安全的哈希表;它继承于AbstractMap类,并且实现ConcurrentMap接口。ConcurrentHashMap是通过“锁分段”来实现的,它支持并发。


· ConcurrentSkipListMap:是线程安全的有序的哈希表,类似有序的TreepMap; 它继承于AbstractMap类,并且实现ConcurrentNavigableMap接口。ConcurrentSkipListMap是通过“跳表”来实现的,它支持并发。

(4) Queue

可以从以下两个维度来分类。一个维度是阻塞与非阻塞,所谓阻塞指的是当队列已满时,入队操作阻塞;当队列已空时,出队操作阻塞。

另一个维度是单端与双端,单端指的是只能队尾入队,队首出队;而双端指的是队首队尾皆可入队出队。Java 并发包里阻塞队列都用 Blocking 关键字标识,单端队列使用 Queue 标识,双端队列使用 Deque 标识。

ArrayBlockingQueue是数组实现的线程安全的有界的阻塞队列。通过ReentrantLock 的一把锁,+Condition 信号量,实现并发控制。

add 队列满了就是抛出异常,

offer 队列满了就返回添加失败

put 队列满了就阻塞等待   Condition.await(),这种方法实现阻塞

take会阻塞,pull不会阻塞没取到就返回null,队头获取数据,对尾添加数据,单向的FIFO。

LinkedBlockingQueue是单向链表实现的(指定大小)阻塞队列,该队列按 FIFO(先进先出)排序元素。内部使用了 ReentrantLock 两把锁来实现 并发控制,一把takeLocl,一把putLock。 队头取数据,队尾插入数据。

 
LinkedBlockingDeque是双向链表实现的(指定大小)双向并发阻塞队列,该阻塞队列同时支持FIFO和FILO两种操作方式。 内部使用了 ReentrantLock 两把锁来实现 并发控制,一把锁lock。

ConcurrentLinkedQueue,CAS方式实现非阻塞,是单向链表实现的无界队列,该队列按 FIFO(先进先出)排序元素。
ConcurrentLinkedDeque,CAS方式实现非阻塞,是双向链表实现的无界队列,该队列同时支持FIFO和FILO两种操作方式。

单端非阻塞队列:其实现是 ConcurrentLinkedQueue。

双端非阻塞队列:其实现是 ConcurrentLinkedDeque。

图片总结:

 

  • 13
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值