🧵 线程模型与生命周期
Java 线程与 OS 线程的映射;线程状态机与转换条件;Thread vs Runnable vs Callable;虚拟线程(Project Loom)。
第1阶段 线程基础 → 线程创建、状态转换、生命周期第2阶段 同步机制 → synchronized、volatile、锁机制第3阶段 并发工具 → CountDownLatch、CyclicBarrier、Semaphore第4阶段 并发容器 → ConcurrentHashMap、BlockingQueue第5阶段 线程池 → ThreadPoolExecutor、ForkJoinPool第6阶段 内存模型 → JMM、happens-before、指令重排 Java 并发编程 │ ┌───────────┬───────────┼───────────┬───────────┐ ▼ ▼ ▼ ▼ ▼ 线程基础 同步机制 并发工具 并发容器 线程池 │ │ │ │ │• Thread • synchronized • CountDownLatc • ConcurrentHashMap • ThreadPoolExecutor• 状态机 • volatile • CyclicBarrier • BlockingQueue • ForkJoinPool• 中断 • ReentrantLock • Semaphore • Atomic • 任务调度• 虚拟线程 • AQS • CompletableFuture • CopyOnWrite • 拒绝策略| 专题 | 考察频率 | 难度 | 核心能力 |
|---|---|---|---|
| synchronized 原理 | ★★★★★ | 高 | 锁升级机制 |
| AQS 队列 | ★★★★★ | 高 | 队列管理 |
| 线程池参数 | ★★★★★ | 中 | 参数调优 |
| ConcurrentHashMap | ★★★★★ | 高 | 并发安全 |
| volatile & JMM | ★★★★☆ | 高 | 内存语义 |
| 虚拟线程 | ★★★☆☆ | 中 | 新技术掌握 |
🧵 线程模型与生命周期
Java 线程与 OS 线程的映射;线程状态机与转换条件;Thread vs Runnable vs Callable;虚拟线程(Project Loom)。
🔒 锁机制与 AQS
synchronized 的偏向锁/轻量级锁/重量级锁升级;ReentrantLock vs synchronized;AQS 同步队列原理;读写锁与 StampedLock。
🏊 线程池
ThreadPoolExecutor 七大参数;核心线程/最大线程/队列的协作机制;拒绝策略;ForkJoinPool 与工作窃取;线程池监控与调优。
📦 并发容器
ConcurrentHashMap 分段锁→CAS+synchronized 演进;CopyOnWriteArrayList 适用场景;BlockingQueue 家族;Atomic 原子类与 CAS 原理。
🧠 Java 内存模型(JMM)
主内存与工作内存;happens-before 规则;volatile 的内存语义;double-checked locking 的正确姿势;指令重排与内存屏障。
| 专题 | 初级 | 中级 | 高级 | 代表问题 |
|---|---|---|---|---|
| 线程模型 | ⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐⭐ | 线程有哪些状态?BLOCKED 和 WAITING 的区别? |
| 锁机制/AQS | ⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | synchronized 的锁升级过程?AQS 是如何实现公平锁的? |
| 线程池 | ⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | 核心线程数怎么设置?任务队列满了会发生什么? |
| 并发容器 | ⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ConcurrentHashMap 如何实现并发安全?JDK7 vs JDK8? |
| JMM | ⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | volatile 能保证原子性吗?happens-before 有哪些规则? |
Java 并发编程体系├── 线程基础│ ├── Thread / Runnable / Callable / Future│ ├── 线程状态:NEW → RUNNABLE → BLOCKED/WAITING/TIMED_WAITING → TERMINATED│ └── 线程中断:interrupt() / isInterrupted() / interrupted()│├── 同步机制│ ├── synchronized(内置锁,JVM 层面)│ │ └── 锁升级:无锁 → 偏向锁 → 轻量级锁 → 重量级锁│ ├── volatile(可见性 + 禁止重排)│ └── java.util.concurrent.locks(JDK 层面)│ ├── ReentrantLock(可重入、可中断、可超时、可公平)│ ├── ReentrantReadWriteLock(读写分离)│ ├── StampedLock(乐观读,Java 8+)│ └── AQS(AbstractQueuedSynchronizer)—— 所有锁的基础框架│├── 并发工具│ ├── CountDownLatch / CyclicBarrier / Semaphore / Phaser / Exchanger│ └── CompletableFuture(异步编排,Java 8+)│├── 并发容器│ ├── ConcurrentHashMap / ConcurrentSkipListMap│ ├── CopyOnWriteArrayList / CopyOnWriteArraySet│ ├── BlockingQueue:ArrayBQ / LinkedBQ / PriorityBQ / DelayQueue / SynchronousQueue│ └── Atomic 原子类:AtomicInteger / AtomicReference / LongAdder│└── 线程池 ├── ThreadPoolExecutor(核心实现) ├── ScheduledThreadPoolExecutor(定时任务) ├── ForkJoinPool(分治 + 工作窃取) └── Executors 工厂方法(慎用!可能隐藏参数风险)理解并发问题必须先搞清楚三个根本原因:
可见性问题 原因:CPU 缓存导致各线程看到的内存值不一致 解决:volatile、synchronized、final
原子性问题 原因:多步操作在执行中途被其他线程打断 解决:synchronized、ReentrantLock、CAS/Atomic 类
有序性问题 原因:编译器/CPU 指令重排,改变了代码执行顺序 解决:volatile(内存屏障)、happens-before 规则| 版本 | 重要新增 |
|---|---|
| Java 5 | java.util.concurrent 包(J.U.C)正式引入;Atomic 类;线程池框架 |
| Java 6 | synchronized 锁优化(偏向锁、轻量级锁、锁消除、锁粗化) |
| Java 7 | ForkJoinPool 引入;TransferQueue |
| Java 8 | StampedLock;LongAdder;CompletableFuture;并行流 |
| Java 9 | VarHandle(替代部分 Unsafe 操作) |
| Java 21 | 虚拟线程(Virtual Threads)正式 GA,每百万虚拟线程只占少量 OS 线程 |
第1天 线程模型与生命周期 → 基础扎实,状态转换图要能手画第2天 synchronized 原理 → 锁升级是中高级必问,理解 Mark Word第3天 AQS 与 ReentrantLock → 理解 CLH 队列和 state 变量语义第4天 线程池原理与调优 → 参数含义和任务处理流程必须脱口而出第5天 JMM 与 volatile → happens-before 要能举例,DCL 写法要正确