JUC 并发编程总览
欢迎来到 Java 并发(JUC) 学习文档,这里会系统梳理 Java 并发编程中的核心知识点,并结合源码与实际场景进行讲解。
📚 当前已涵盖的主题
本模块目前包含以下核心主题:
1. ThreadLocal 专题
ThreadLocal 是 Java 中实现线程局部变量的重要工具。本专题围绕以下核心问题展开:
-
什么是 ThreadLocal? - 理解线程局部变量的概念和应用场景
-
ThreadLocal 的底层存储原理 - 深入源码,理解 ThreadLocalMap 的数据结构
-
ThreadLocal 为何会导致内存泄漏? - 分析弱引用 Key 和强引用 Value 带来的内存风险
-
如何正确使用 ThreadLocal,避免泄漏? - 掌握最佳实践和解决方案
-
如何跨线程传递 ThreadLocal 的值? - 学习 InheritableThreadLocal、TransmittableThreadLocal 等方案
-
InheritableThreadLocal 的实现原理 - 理解父子线程间的值传递机制
-
TransmittableThreadLocal 的实现原理 - 掌握线程池场景下的上下文传递方案
2. 线程池专题
线程池 是 Java 并发编程中管理和复用线程的核心框架。本专题涵盖以下内容:
-
什么是线程池? - 理解池化思想和线程池的核心价值
-
如何创建线程池? - 学习 Executors 工厂类和 ThreadPoolExecutor 构造方法
-
为什么不推荐使用 Executors 创建线程池? - 理解资源耗尽风险和最佳实践
-
线程池的核心线程会被回收吗? - 理解 allowCoreThreadTimeOut 参数的作用
-
核心线程空闲时处于什么状态? - 理解 WAITING 和 TIMED_WAITING 状态
-
线程池的拒绝策略有哪些? - 掌握 AbortPolicy、CallerRunsPolicy 等四种标准策略
-
线程池常用的阻塞队列有哪些? - 学习 ArrayBlockingQueue、LinkedBlockingQueue 等队列特性
-
线程池处理任务的流程 - 深入理解"先核心,后队列,再最大,最后拒绝"的执行逻辑
-
线程池中线程异常后,销毁还是复用? - 理解 execute() 和 submit() 的差异
-
如何给线程池命名? - 掌握线程命名的最佳实践
-
如何合理地设置线程池的大小? - 学会根据 CPU 密集型和 I/O 密集型任务进行调优
🔥 锁与同步机制深度系列(推荐按顺序阅读)
以下三篇文章构成了一条渐进式学习路线,从"会用"到"理解框架"再到"读懂源码",带你彻底掌握 JUC 锁机制的核心:
| 阅读顺序 | 文章 | 定位 | 内容概述 |
|---|---|---|---|
| ① 入门 | 并发工具类全景指南 | 会用 | 系统介绍 CountDownLatch、CyclicBarrier、Semaphore、ReentrantLock、读写锁、StampedLock、原子类、并发容器、CompletableFuture 等核心工具,配有完整代码示例 |
| ② 进阶 | AQS 深度解析 | 理解框架 | 基于 JDK 17 源码,拆解 AQS 三大支柱(state、CLH 队列、模板方法),逐行分析 acquire/release 独占流程、共享模式、LockSupport 原理及 ConditionObject 双队列模型 |
| ③ 深入 | ReentrantLock 源码全解 | 读源码 | 深入分析公平/非公平锁的 tryAcquire 差异、可重入 state 递增机制、Condition 在生产者-消费者中的全链路流转,附公平锁 vs 非公平锁性能 Benchmark |
3. 并发工具类全景指南 ① 入门
系统介绍 java.util.concurrent 包中最核心的并发工具类,涵盖同步协调、锁机制、原子类、并发容器与异步编排五大板块:
- CountDownLatch — 倒计时门闩,让一个或多个线程等待其他 N 个操作完成
- CyclicBarrier — 循环栅栏,N 个线程互相等待,到齐后一起出发
- Semaphore — 信号量,控制同时访问资源的最大线程数
- ReentrantLock — 可重入锁,功能更强大的 synchronized 替代品
- ReentrantReadWriteLock — 读写锁,读多写少场景的性能优化
- StampedLock — 邮戳锁,乐观读带来极致读性能
- 原子类 Atomic 家族 — 无锁线程安全的变量操作(含 LongAdder 高性能计数器)
- 并发容器 — ConcurrentHashMap、CopyOnWriteArrayList 等
- CompletableFuture — 异步编排,链式组合异步任务
4. AQS 深度解析 ② 进阶
基于 JDK 17 源码深入解析 AQS 的设计思想与内部实现。AQS 是 ReentrantLock、Semaphore、CountDownLatch 等工具的底层框架,理解 AQS 等于拿到了打开 JUC 源码大门的钥匙:
- state 同步状态 — 一个 volatile int 如何在不同同步器中承载不同语义
- CLH 等待队列 — 双向链表的设计细节:哨兵 head、延迟设置 SIGNAL、从 tail 往前遍历
- 模板方法模式 — 框架定义流程(acquire/release),子类定义语义(tryAcquire/tryRelease)
- 独占模式完整流程 — 逐层拆解 addWaiter → acquireQueued → shouldParkAfterFailedAcquire → unparkSuccessor
- 共享模式 — 传播唤醒的精髓与 setHeadAndPropagate
- LockSupport — 许可证机制,与 wait/notify 的本质区别
- ConditionObject 双队列模型 — await/signal 在同步队列与条件队列之间的节点转移
5. ReentrantLock 源码全解 ③ 深入
基于 JDK 17 源码,深入分析 ReentrantLock 如何用不到 100 行代码实现一把功能完整的可重入互斥锁:
- 类架构 — Sync → NonfairSync / FairSync 的继承体系
- 非公平锁 vs 公平锁 — 差异只在一行
hasQueuedPredecessors() - 可重入的实现 — state 递增递减 + exclusiveOwnerThread
- tryRelease 解锁源码 — state 减到 0 才真正释放
- Condition 全链路流转 — 生产者-消费者中 await/signal 的完整状态变化图
- 性能实测 Benchmark — 公平锁通常慢 2-10 倍的原因与上下文切换代价分析
- 最佳实践与陷阱 — lock 写在 try 外面、tryLock 防死锁模式、lockInterruptibly 响应中断
🚀 后续规划
本模块将继续扩展更多 JUC 核心主题,包括但不限于:
- Semaphore 源码解析 — AQS 共享模式的典型应用
- ReentrantReadWriteLock 源码解析 — 读写锁的 state 高低 16 位拆分设计
- Java 内存模型(JMM) — happens-before 与内存可见性
- Fork/Join 框架 — 并行计算与工作窃取算法
本索引页会作为整体导航,帮助你快速了解每个小节在并发体系中的位置。
开始你的 Java 并发学习之旅吧!🚀
ThreadLocal
---
线程池
什么是线程池
AQS
什么是AQS?
并发工具类全景指南
系统介绍 JUC 包中最核心的并发工具类,涵盖同步协调、锁机制、原子类、并发容器与异步编排五大板块
AQS 深度解析
基于 JDK 17 源码深入解析 AQS 的设计思想与内部实现,涵盖 state、CLH 队列、模板方法模式和 ConditionObject
ReentrantLock 源码全解
基于 JDK 17 源码深入分析 ReentrantLock 的公平/非公平锁实现、可重入机制、Condition 全链路流转与性能实测