Java充电社
专辑
博文
联系我
本人继续续收门徒,亲手指导
Java高并发教程
-> JUC中一些常见的集合
1、必须知道的几个概念
2、并发级别
3、有关并行的两个重要定律
4、JMM相关的一些概念
5、深入理解进程和线程
6、线程的基本操作
7、volatile与Java内存模型
8、线程组
9、用户线程和守护线程
10、线程安全和synchronized
11、中断线程的几种方式
12、JUC中ReentrantLock
13、JUC中的Condition
14、JUC中的LockSupport工具类
15、UC中的Semaphore(信号量)
16、JUC中的CountDownLatch
17、JUC中的循环栅栏CyclicBarrier
18、线程池
19、JUC中的Executor框架详解1
20、JUC中的Executor框架详解2
21、java中的CAS
22、java中的UnSafe类
23、JUC中的原子操作类
24、ThreadLocal、InheritableThreadLocal
25、JUC中的阻塞队列
26、JUC中一些常见的集合
27、实战:你的接口太慢了需要优化
28、实战:构建日志系统
29、实战:一起来搞懂限流
30、JUC中的CompletableFuture
31、等待线程完成的方式你知道几种?
32、原子操作增强类LongAdder、LongAccumulator
33、怎么演示公平锁和非公平锁
34、谷歌提供的一些好用的并发工具类
35、延迟队列 DelayQueue 详解
36、线程6种状态详解
37、如何实现一个通用的延迟队列?
上一篇:JUC中的阻塞队列
下一篇:实战:你的接口太慢了需要优化
<div style="display:none"></div> ## 本文内容 1. 了解JUC常见集合,学会使用 3. ConcurrentHashMap 4. ConcurrentSkipListMap 5. ConcurrentSkipListSet 6. CopyOnWriteArraySet 7. 介绍Queue接口 7. ConcurrentLinkedQueue 8. CopyOnWriteArrayList 9. 介绍Deque接口 10. ConcurrentLinkedDeque ## JUC集合框架图 ![](https://itsoku.oss-cn-hangzhou.aliyuncs.com/itsoku/blog/article/26/1bb74614-56e0-4198-88cf-a7d48eeac363.png) > 图可以看到,JUC的集合框架也是从Map、List、Set、Queue、Collection等超级接口中继承而来的。所以,大概可以知道JUC下的集合包含了一一些基本操作,并且变得线程安全。 ## Map ### ConcurrentHashMap 功能和HashMap基本一致,内部使用红黑树实现的。 **特性:** 1. 迭代结果和存入顺序不一致 2. key和value都不能为空 3. 线程安全的 ### ConcurrentSkipListMap 内部使用跳表实现的,放入的元素会进行排序,排序算法支持2种方式来指定: 1. 通过构造方法传入一个`Comparator` 2. 放入的元素实现`Comparable`接口 上面2种方式必选一个,如果2种都有,走规则1。 **特性:** 1. 迭代结果和存入顺序不一致 2. 放入的元素会排序 3. key和value都不能为空 4. 线程安全的 ## List ### CopyOnWriteArrayList 实现List的接口的,一般我们使用`ArrayList、LinkedList、Vector`,其中只有Vector是线程安全的,可以使用Collections静态类的synchronizedList方法对ArrayList、LinkedList包装为线程安全的List,不过这些方式在保证线程安全的情况下性能都不高。 CopyOnWriteArrayList是线程安全的List,内部使用数组存储数据,`集合中多线程并行操作一般存在4种情况:读读、读写、写写、写读,这个只有在写写操作过程中会导致其他线程阻塞,其他3种情况均不会阻塞`,所以读取的效率非常高。 可以看一下这个类的名称:CopyOnWrite,意思是在写入操作的时候,进行一次自我复制,换句话说,当这个List需要修改时,并不修改原有内容(这对于保证当前在读线程的数据一致性非常重要),而是在原有存放数据的数组上产生一个副本,在副本上修改数据,修改完毕之后,用副本替换原来的数组,这样也保证了写操作不会影响读。 **特性:** 1. 迭代结果和存入顺序一致 2. 元素不重复 3. 元素可以为空 4. 线程安全的 5. 读读、读写、写读3种情况不会阻塞;写写会阻塞 6. 无界的 ## Set ### ConcurrentSkipListSet 有序的Set,内部基于ConcurrentSkipListMap实现的,放入的元素会进行排序,排序算法支持2种方式来指定: 1. 通过构造方法传入一个`Comparator` 2. 放入的元素实现`Comparable`接口 上面2种方式需要实现一个,如果2种都有,走规则1 **特性:** 1. 迭代结果和存入顺序不一致 2. 放入的元素会排序 3. 元素不重复 4. 元素不能为空 5. 线程安全的 6. 无界的 ### CopyOnWriteArraySet 内部使用CopyOnWriteArrayList实现的,将所有的操作都会转发给CopyOnWriteArrayList。 **特性:** 1. 迭代结果和存入顺序不一致 2. 元素不重复 3. 元素可以为空 4. 线程安全的 5. 读读、读写、写读 不会阻塞;写写会阻塞 6. 无界的 ## Queue Queue接口中的方法,我们再回顾一下: | 操作类型 | 抛出异常 | 返回特殊值 | | :------- | :---------- | :--------- | | 插入 | `add(e)` | `offer(e)` | | 移除 | `remove()` | `poll()` | | 检查 | `element()` | `peek()` | 3种操作,每种操作有2个方法,不同点是队列为空或者满载时,调用方法是抛出异常还是返回特殊值,大家按照表格中的多看几遍,加深记忆。 ### ConcurrentLinkedQueue 高效并发队列,内部使用链表实现的。 **特性:** 1. 线程安全的 2. 迭代结果和存入顺序一致 3. 元素可以重复 4. 元素不能为空 5. 线程安全的 6. 无界队列 ## Deque 先介绍一下Deque接口,双向队列(Deque)是Queue的一个子接口,双向队列是指该队列两端的元素既能入队(offer)也能出队(poll),如果将Deque限制为只能从一端入队和出队,则可实现栈的数据结构。对于栈而言,有入栈(push)和出栈(pop),遵循先进后出原则。 一个线性 collection,支持在两端插入和移除元素。名称 *deque* 是“double ended queue(双端队列)”的缩写,通常读为“deck”。大多数 `Deque` 实现对于它们能够包含的元素数没有固定限制,但此接口既支持有容量限制的双端队列,也支持没有固定大小限制的双端队列。 此接口定义在双端队列两端访问元素的方法。提供插入、移除和检查元素的方法。每种方法都存在两种形式:一种形式在操作失败时抛出异常,另一种形式返回一个特殊值(`null` 或 `false`,具体取决于操作)。插入操作的后一种形式是专为使用有容量限制的 `Deque` 实现设计的;在大多数实现中,插入操作不能失败。 下表总结了上述 12 种方法: | | **第一个元素(头部)** | 第一个元素(头部) | 最后一个元素(尾部) | 最后一个元素(尾部) | | -------- | ---------------------- | ------------------ | -------------------- | -------------------- | | | *抛出异常* | *特殊值* | *抛出异常* | *特殊值* | | **插入** | `addFirst(e)` | `offerFirst(e)` | `addLast(e)` | `offerLast(e)` | | **移除** | `removeFirst()` | `pollFirst()` | `removeLast()` | `pollLast()` | | **检查** | `getFirst()` | `peekFirst()` | `getLast()` | `peekLast()` | 此接口扩展了 `Queue`接口。在将双端队列用作队列时,将得到 FIFO(先进先出)行为。将元素添加到双端队列的末尾,从双端队列的开头移除元素。从 `Queue` 接口继承的方法完全等效于 `Deque` 方法,如下表所示: 此接口扩展了 `Queue`接口。在将双端队列用作队列时,将得到 FIFO(先进先出)行为。将元素添加到双端队列的末尾,从双端队列的开头移除元素。从 `Queue` 接口继承的方法完全等效于 `Deque` 方法,如下表所示: | **Queue 方法** | **等效 Deque 方法** | | -------------- | ------------------- | | `add(e)` | `addLast(e)` | | `offer(e)` | `offerLast(e)` | | `remove()` | `removeFirst()` | | `poll()` | `pollFirst()` | | `element()` | `getFirst()` | | `peek()` | `peekFirst()` | ### ConcurrentLinkedDeque 实现了Deque接口,内部使用链表实现的高效的并发双端队列。 **特性:** 1. 线程安全的 2. 迭代结果和存入顺序一致 3. 元素可以重复 4. 元素不能为空 5. 线程安全的 6. 无界队列 ## BlockingQueue 关于阻塞队列,上一篇有详细介绍,可以看看:**<a target="_blank" href="/course/1/25">掌握JUC中的阻塞队列</a>** <a style="display:none" target="_blank" href="https://mp.weixin.qq.com/s/_S1DD2JADnXvpexxaBwLLg" style="color:red; font-size:20px; font-weight:bold">继续收门徒,亲手带,月薪 4W 以下的可以来找我</a> ## 最新资料 1. <a href="https://mp.weixin.qq.com/s?__biz=MzkzOTI3Nzc0Mg==&mid=2247484964&idx=2&sn=c81bce2f26015ee0f9632ddc6c67df03&scene=21#wechat_redirect" target="_blank">尚硅谷 Java 学科全套教程(总 207.77GB)</a> 2. <a href="https://mp.weixin.qq.com/s?__biz=MzkwOTAyMTY2NA==&mid=2247484192&idx=1&sn=505f2faaa4cc911f553850667749bcbb&scene=21#wechat_redirect" target="_blank">2021 最新版 Java 微服务学习线路图 + 视频</a> 3. <a href="https://mp.weixin.qq.com/s?__biz=MzkwOTAyMTY2NA==&mid=2247484573&idx=1&sn=7f3d83892186c16c57bc0b99f03f1ffd&scene=21#wechat_redirect" target="_blank">阿里技术大佬整理的《Spring 学习笔记.pdf》</a> 4. <a href="https://mp.weixin.qq.com/s?__biz=MzkwOTAyMTY2NA==&mid=2247484544&idx=2&sn=c1dfe907cfaa5b9ae8e66fc247ccbe84&scene=21#wechat_redirect" target="_blank">阿里大佬的《MySQL 学习笔记高清.pdf》</a> 5. <a href="https://mp.weixin.qq.com/s?__biz=MzkwOTAyMTY2NA==&mid=2247485167&idx=1&sn=48d75c8e93e748235a3547f34921dfb7&scene=21#wechat_redirect" target="_blank">2021 版 java 高并发常见面试题汇总.pdf</a> 6. <a href="https://mp.weixin.qq.com/s?__biz=MzkwOTAyMTY2NA==&mid=2247485664&idx=1&sn=435f9f515a8f881642820d7790ad20ce&scene=21#wechat_redirect" target="_blank">Idea 快捷键大全.pdf</a> ![](https://itsoku.oss-cn-hangzhou.aliyuncs.com/itsoku/blog/article/1/2883e86e-3eff-404a-8943-0066e5e2b454.png)
#custom-toc-container