线程是执行单元,锁是协调手段,线程池是资源管理方式,异步是任务组织范式;重点理解RUNNABLE包含就绪与运行、BLOCKED与WAITING区别、锁对象绑定Mark Word、线程池五参数协作流程及CompletableFuture的非阻塞编排能力。

复习Java线程、锁、线程池与异步编程,关键不是背概念,而是理清四者之间的逻辑链条:线程是执行单元,锁是协调手段,线程池是资源管理方式,异步是任务组织范式。抓准这条主线,就能把散点知识串成骨架。
紧扣生命周期理解线程行为
别死记六种状态名称,重点搞懂三个易错切换点:
- RUNNABLE ≠ 正在运行:它包含“就绪”和“运行”两种OS状态,Java层无法区分;CPU没分配时间片时,线程就在排队,但状态仍是RUNNABLE
- BLOCKED 和 WAITING 不是一回事:BLOCKED 是抢 synchronized 锁失败,在锁池里等 owner 释放;WAITING 是调用了 wait()、join()、LockSupport.park(),主动让出CPU,进的是等待队列
- NEW 和 TERMINATED 都不可逆:new 出来没 start 是 NEW;run()结束或异常退出后是 TERMINATED;两者都不能再 start(),否则抛 IllegalThreadStateException
锁机制要穿透到“锁住了什么”
synchronized 和 Lock 不是魔法,它们的底层对象是 Monitor,而 Monitor 绑定在 Java 对象头(Mark Word)上:
- synchronized(this) 锁的是当前实例对象;synchronized(静态方法) 锁的是 Class 对象
- 偏向锁→轻量级锁→重量级锁 是单向升级过程:无竞争用偏向锁(比对线程ID),有竞争先自旋(轻量级锁),自旋失败才挂起线程(重量级锁)
- volatile 不是锁:它只保证可见性和禁止指令重排,不保证原子性;count++ 这类复合操作仍需 synchronized 或 CAS
线程池参数必须结合执行流程记
ThreadPoolExecutor 的五个参数不是孤立数字,而是一套协作规则:
- 任务提交后,先尝试用核心线程执行;不够用就进阻塞队列
- 队列满了,才创建非核心线程(最多到 maximumPoolSize)
- 非核心线程空闲超过keepAliveTime,就会被回收
- 队列满 + 线程数达上限 → 触发拒绝策略:Abort(抛异常)、CallerRuns(由提交线程自己执行)、Discard(静默丢弃)等
异步编程本质是“结果交付机制”的演进
从裸线程到 CompletableFuture,核心变化在于谁负责编排、谁处理异常、谁控制超时:
- Future.get() 是阻塞式获取,主线程卡住等结果;适合简单场景,但容易拖垮调用方
- CompletableFuture 支持链式调用(thenApply、thenCompose)、组合多个异步任务(allOf、anyOf)、统一异常处理(exceptionally、handle)
- @Async 底层依赖线程池,方法返回值只能是 void 或 Future;若需结果,必须用 AsyncResult 封装,且不能捕获原始异常堆栈
- 虚拟线程(Java 21+) 不是替代线程池,而是降低高并发 IO 场景下线程创建成本;它仍需配合结构化并发(StructuredTaskScope)做生命周期管理
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











