集合规约
JAVA 中集合之间的相互关系如下所示:
Collection 是总头领。Set, List, Queue 都继承自 Collection。
数据结构
数据结构定义:逻辑意义上的数据组织方式及其相应的处理方式。
数据组织方式:
线性结构;
树结构;
图结构;
哈希结构;
处理方式:
增删改查
数据结构的优化与运算规模有关,也与调用频率有关。所以具体采用什么数据结构,要集合实际情况。
HashMap
HashMap 的基本概念
HashMap 具有多个slot,每个 slot 保存一个链表。当链表中的数据个数超过某个阈值时,链表变为红黑树。
HashMap 工作流程
-
计算容量
HashMap 分配空间的大小:
比 Capacity 大的最近的2的幂
-
对数据进行落槽运算:取余运算
subList
ArrayList 中的 subList 结果不可强转成 ArrayList。因为内部类 SubList 并不是 ArrayList 本身。而是 ArrayList的一个视图。
并发处理
并发:交替处理多任务
并行:同时处理多任务
线程不安全指的是:线程在交替执行的时候,共享某个资源。但是在使用的时候没有加锁,数据发生了变化。
使用线程不安全的情况:
有时会选择线程不安全的情况,比如数据只在单线程内可见,或者对象是只读的。
保证高并发下的线程安全,可以从以下四个维度考量:
-
数据单线程可见
-
只读对象
-
线程安全类
-
同步与锁机制
AQS:解决多线程访问共享资源并发问题的同步管理框架。
AQS 抢的是 int state : 更新状态的控制权
队列:资源队列;等待队列
独占线程:在 AOS 中设置的
线程与线程池
线程可以拥有自己的操作栈、程序计数器、局部变量表等资源。它与同一进程内的其它线程共享该进程的所有资源。
线程的五个状态
NEW;
RUNNABLE;
RUNNING;
DEAD;
BLOCKED
线程池的状态
Running
ShutDown
Stop
Tidying
Terminated
线程池的作用:
-
利用线程池管理并复用线程、控制最大并发数
-
增加对线程的管理,快速排查问题
-
实现任务线程队列换成策略和拒绝机制
-
实现某些与实践相关的功能
-
隔离线程环境