集合和并发学习笔记
一、 集合规约
1.1 整体了解JAVA集合
红色表示接口,蓝色代表抽象类,绿色表示并发包中的集合;灰色表示早期线程安全类,已经不推荐使用。
1. 集合顶级接口
两个超顶级接口:线性存储Collection, KV存储Map 。
Collection根据使用特点又区分三个:
List: 普通列表
Set:集合,元素不可重复
Queue:队列,按规则排队。
2. List系列
两个实现。
ArrayList: 数组实现
LinkedList: 链表实现
3. Set系列
HashSet: 最基础的Set实现,其实就是一个HashMap, 每次add,都会put(key, 固定的一个Object)
LinkedHashSet: 其实就是LinkedHashMap, 可以保证遍历时,按照插入顺序来遍历。
TreeSet: 排序集合,遍历时根据值本身大小排序遍历。
4. Queue系列
Queue系列主要用于并发控制。
5. Map系列
HashMap: 最基本的Map
LinkedHashMap: 保证遍历顺序同插入顺序
TreeMap: 根据Key大小排序
ConcurrentHashMap: 并发Map,老师推荐
1.2 Collectors.toMap方法的坑
TODO: 需要再研究一下,还没搞懂。
1.3 ArrayList.subList 不可强转成ArrayList
ArrayList.subList返回的是一个ArrayList内部类,表示是ArrayList的一个视图。
二、 并发处理
2.1 概念
并发:一段时间内容,多任务交替处理能力
并行:同时处理多任务的能力
2.2 线程安全问题
如图,由于每个线程都可能被中断,本地操作的变量副本和主内存不一致,所以造成线程安全问题。这个图也解释了使用volatile修改变量的意义。使用volatile修饰的变量,每次read时,直接从主内存中读取。
2.3 线程安全四维度
1. 数据单线程内可见
一般指的是方法内局部变量。
2. 只读对象
比如String对象,就是一个线程安全对象。不能对其做数据修改。
3. 线程安全类
比如使用ConcurrentHashMap
4. 同步与锁机制
JAVA中常用锁实现的方式:并发包中的锁类,利用同步代码块。
2.4 锁的本质AQS
1. AQS基础
AQS:解决多线程访问共享资源并发问题的同步管理框架,为Java并发同步组件提供统一的底层支持,支持有目的、有步骤、有计划的协同作业, 具有两大职责
资源管理:获取资源,根据资源的同步状态,有则取锁,无则入队等待;释放资源,修改资源同步状态,并唤醒等待线程。
支持多种同步机制:支持独占和共享锁两种资源获取方式;线程阻塞后,支持取消中断,支持超时中断。
2. AQS使用场景
线程同步类: Semphore, ReentrantReadWriteLock, ReentrantLock, CountDownLatch, CyclicBarrier
线程池:ThreadPoolExecutor, ScheduledThreadPoolExecutor
线程安全集合:ConcurrentHashMap等
3. AQS核心数据结构和算法
三、线程和线程池
3.1 线程状态
3.2 线程池状态
3.3 线程池相关类图
四、总结
这块的体系太庞大了,浓缩在一节课中,直接将我击溃。