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。
图片总结: