|
@@ -9,6 +9,7 @@
|
|
|
## 一、多线程入门(对应 08-08)
|
|
## 一、多线程入门(对应 08-08)
|
|
|
|
|
|
|
|
### 1. 基本概念(必背)
|
|
### 1. 基本概念(必背)
|
|
|
|
|
+
|
|
|
| 概念 | 说明 |
|
|
| 概念 | 说明 |
|
|
|
|------|------|
|
|
|------|------|
|
|
|
| **程序** | 硬盘中的文件,静态代码 |
|
|
| **程序** | 硬盘中的文件,静态代码 |
|
|
@@ -19,6 +20,7 @@
|
|
|
- 进程三大特性:独立性、动态性、并发性
|
|
- 进程三大特性:独立性、动态性、并发性
|
|
|
|
|
|
|
|
### 2. 并行 vs 并发(必背)
|
|
### 2. 并行 vs 并发(必背)
|
|
|
|
|
+
|
|
|
| 概念 | 含义 | 类比 |
|
|
| 概念 | 含义 | 类比 |
|
|
|
|------|------|------|
|
|
|------|------|------|
|
|
|
| **并行** | 同一时刻多指令在**多个 CPU** 上同时执行 | 3 灶台 3 厨师 |
|
|
| **并行** | 同一时刻多指令在**多个 CPU** 上同时执行 | 3 灶台 3 厨师 |
|
|
@@ -46,6 +48,7 @@ t.start();
|
|
|
- `FutureTask` 是"中间人";`get()` 阻塞等待计算结果
|
|
- `FutureTask` 是"中间人";`get()` 阻塞等待计算结果
|
|
|
|
|
|
|
|
**三种方式对比:**
|
|
**三种方式对比:**
|
|
|
|
|
+
|
|
|
| 维度 | 继承 Thread | 实现 Runnable | 实现 Callable |
|
|
| 维度 | 继承 Thread | 实现 Runnable | 实现 Callable |
|
|
|
|------|------------|--------------|---------------|
|
|
|------|------------|--------------|---------------|
|
|
|
| 返回结果 | 无 | 无 | **有** |
|
|
| 返回结果 | 无 | 无 | **有** |
|
|
@@ -74,6 +77,7 @@ t.start();
|
|
|
- 经典场景:GC 线程、心跳检测、后台日志
|
|
- 经典场景:GC 线程、心跳检测、后台日志
|
|
|
|
|
|
|
|
### 4. 线程 6 种状态(必背)
|
|
### 4. 线程 6 种状态(必背)
|
|
|
|
|
+
|
|
|
| 状态 | 枚举 | 触发 |
|
|
| 状态 | 枚举 | 触发 |
|
|
|
|------|------|------|
|
|
|------|------|------|
|
|
|
| 新建 | NEW | new Thread() 未 start() |
|
|
| 新建 | NEW | new Thread() 未 start() |
|
|
@@ -87,6 +91,7 @@ t.start();
|
|
|
- OS 5 状态(就绪/运行分开)vs Java 6 状态(就绪+运行合并为 RUNNABLE)
|
|
- OS 5 状态(就绪/运行分开)vs Java 6 状态(就绪+运行合并为 RUNNABLE)
|
|
|
|
|
|
|
|
### 5. 线程操作方法(必背)
|
|
### 5. 线程操作方法(必背)
|
|
|
|
|
+
|
|
|
| 方法 | 作用 |
|
|
| 方法 | 作用 |
|
|
|
|------|------|
|
|
|------|------|
|
|
|
| `join()` / `join(ms)` | 当前线程等待目标线程结束 / 限时等待 |
|
|
| `join()` / `join(ms)` | 当前线程等待目标线程结束 / 限时等待 |
|
|
@@ -112,6 +117,7 @@ t.start();
|
|
|
3. **读-改-写复合操作**(count++、tickets--)
|
|
3. **读-改-写复合操作**(count++、tickets--)
|
|
|
|
|
|
|
|
### 4. 线程安全三大特性(必须背)
|
|
### 4. 线程安全三大特性(必须背)
|
|
|
|
|
+
|
|
|
| 特性 | 含义 | 解决方案 |
|
|
| 特性 | 含义 | 解决方案 |
|
|
|
|------|------|----------|
|
|
|------|------|----------|
|
|
|
| **原子性** | 操作不可分割 | synchronized、Lock、Atomic 类 |
|
|
| **原子性** | 操作不可分割 | synchronized、Lock、Atomic 类 |
|
|
@@ -127,6 +133,7 @@ t.start();
|
|
|
- **锁粒度尽量小**(只锁共享数据代码,不锁整个方法)
|
|
- **锁粒度尽量小**(只锁共享数据代码,不锁整个方法)
|
|
|
|
|
|
|
|
**三种写法:**
|
|
**三种写法:**
|
|
|
|
|
+
|
|
|
| 写法 | 锁的是什么 |
|
|
| 写法 | 锁的是什么 |
|
|
|
|------|-----------|
|
|
|------|-----------|
|
|
|
| 同步实例方法 `synchronized void m()` | 当前对象 **this** |
|
|
| 同步实例方法 `synchronized void m()` | 当前对象 **this** |
|
|
@@ -148,6 +155,7 @@ t.start();
|
|
|
- volatile 解决"程序永不退出"
|
|
- volatile 解决"程序永不退出"
|
|
|
|
|
|
|
|
### 3. volatile vs synchronized
|
|
### 3. volatile vs synchronized
|
|
|
|
|
+
|
|
|
| 对比 | volatile | synchronized |
|
|
| 对比 | volatile | synchronized |
|
|
|
|------|----------|--------------|
|
|
|------|----------|--------------|
|
|
|
| 本质 | 轻量、不加锁 | 锁机制(Monitor Lock) |
|
|
| 本质 | 轻量、不加锁 | 锁机制(Monitor Lock) |
|
|
@@ -178,6 +186,7 @@ finally { lock.unlock(); }
|
|
|
`lock()` / `unlock()` / `tryLock()`(拿不到立即返回 false)/ `tryLock(timeout, unit)`(限时)/ `lockInterruptibly()`(可中断)
|
|
`lock()` / `unlock()` / `tryLock()`(拿不到立即返回 false)/ `tryLock(timeout, unit)`(限时)/ `lockInterruptibly()`(可中断)
|
|
|
|
|
|
|
|
### 4. synchronized vs Lock 七维对比(面试常考)
|
|
### 4. synchronized vs Lock 七维对比(面试常考)
|
|
|
|
|
+
|
|
|
| 维度 | synchronized | ReentrantLock |
|
|
| 维度 | synchronized | ReentrantLock |
|
|
|
|------|--------------|---------------|
|
|
|------|--------------|---------------|
|
|
|
| 语法 | 简单(关键字) | 复杂(try-finally) |
|
|
| 语法 | 简单(关键字) | 复杂(try-finally) |
|
|
@@ -199,6 +208,7 @@ finally { lock.unlock(); }
|
|
|
4. **循环等待**:你等我、我等你形成环
|
|
4. **循环等待**:你等我、我等你形成环
|
|
|
|
|
|
|
|
### 避免死锁 3 方法
|
|
### 避免死锁 3 方法
|
|
|
|
|
+
|
|
|
| 方法 | 打破的条件 |
|
|
| 方法 | 打破的条件 |
|
|
|
|------|-----------|
|
|
|------|-----------|
|
|
|
| **固定锁顺序**(所有线程按相同顺序加锁) | 打破"循环等待" |
|
|
| **固定锁顺序**(所有线程按相同顺序加锁) | 打破"循环等待" |
|
|
@@ -217,6 +227,7 @@ finally { lock.unlock(); }
|
|
|
**解决方案:【线程复用 + 任务排队 + 动态扩容 + 上限保护】**
|
|
**解决方案:【线程复用 + 任务排队 + 动态扩容 + 上限保护】**
|
|
|
|
|
|
|
|
### 2. ThreadPoolExecutor 7 个参数(必背)
|
|
### 2. ThreadPoolExecutor 7 个参数(必背)
|
|
|
|
|
+
|
|
|
| 参数 | 说明 |
|
|
| 参数 | 说明 |
|
|
|
|------|------|
|
|
|------|------|
|
|
|
| corePoolSize | 核心线程数(常驻) |
|
|
| corePoolSize | 核心线程数(常驻) |
|