开课吧孤尽T31训练营学习笔记-DAY17-集合和并发规约

76 阅读3分钟

集合和并发学习笔记

一、 集合规约

1.1 整体了解JAVA集合

image-20211113155957615.png

红色表示接口,蓝色代表抽象类,绿色表示并发包中的集合;灰色表示早期线程安全类,已经不推荐使用。

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时,直接从主内存中读取。

image-20211113165212454.png

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核心数据结构和算法

image-20211113172101451.png

三、线程和线程池

3.1 线程状态

image-20211113172249492.png

3.2 线程池状态

image-20211113172414936.png

3.3 线程池相关类图

image-20211113172552905.png

四、总结

这块的体系太庞大了,浓缩在一节课中,直接将我击溃。