)
并发编程与JUC通关总结从线程基础到并发容器一套吃透Java高并发全链路2026精版系列导航《Java 100 天进阶之路》完整目录恭喜你你已经完成了《Java 100 天进阶之路》并发编程与JUC详解阶段第51~60篇的全部学习。这是进阶篇中面试权重最高、区分度最大的阶段之一——从线程生命周期到锁升级机制从 JMM 内存模型到 AQS 底层原理从线程池调优到死锁排查从 CompletableFuture 异步编排到 ThreadLocal 内存泄漏治理10 篇文章覆盖了 Java 并发编程 90% 以上的面试考点。从“线程是什么”到“高并发系统设计”你完成了并发编程的完整进阶。本文是这一阶段的通关总结用一张学习路线图 十张速查表 面试题汇总 避坑清单帮你把 10 篇精华全部串联起来。建议收藏随时复习。 本阶段完整学习路线图学习路径建议零基础/系统学习按 51→52→53→54→55→56→57→58→59→60 顺序学习层层递进有基础/面试突击优先看 52锁升级 54AQS 55线程池 60压轴题架构师/调优方向重点关注 53JMM/volatile 56死锁排查 58LongAdder/伪共享 59TTL 分篇核心知识点速查表第51篇线程生命周期与创建方式 查看完整文章核心概念一句话总结高频面试提问6种线程状态NEW → RUNNABLE → BLOCKED/WAITING/TIMED_WAITING → TERMINATEDJava线程有几种状态状态转换start()、sleep()、wait()、notify()、join()触发转换状态之间如何转换4种创建方式Thread、Runnable、Callable、线程池创建线程有几种方式sleep vs waitsleep 不释放锁wait 释放锁sleep() 和 wait() 的区别start vs runstart 启动新线程run 是普通方法调用start() 和 run() 的区别虚拟线程JDK 21 轻量级线程M:N 调度虚拟线程和平台线程的区别虚拟线程适用场景高并发 I/O 密集型不适合 CPU 密集型虚拟线程什么时候用 阅读完整文章第52篇synchronized 深度解析 查看完整文章核心概念一句话总结高频面试提问三种使用方式实例方法锁this、静态方法锁Class、代码块自定义锁对象synchronized 的三种用法Mark Word锁状态存储在对象头中64位JVM占8字节synchronized 的锁存在哪里锁升级全流程无锁 → 偏向锁 → 轻量级锁 → 重量级锁单向升级synchronized 锁升级过程偏向锁单线程场景Mark Word存线程ID无CAS开销偏向锁解决什么问题轻量级锁轻度竞争自旋等待Lock Record轻量级锁怎么工作重量级锁重度竞争OS互斥量ObjectMonitor重量级锁什么时候触发JVM优化自适应自旋、锁消除、锁粗化JVM 对 synchronized 做了哪些优化虚拟线程 Pinningsynchronized 导致虚拟线程固定在载体线程虚拟线程中为什么慎用 synchronized 阅读完整文章第53篇volatile 与 JMM 查看完整文章核心概念一句话总结高频面试提问JMM vs JVM内存结构JMM管“怎么看见”JVM内存结构管“存哪里”JMM 和 JVM 内存结构的区别三大特性原子性synchronized/锁、可见性volatile、有序性内存屏障JMM 解决什么问题volatile 保证✅ 可见性 ✅ 禁止重排 ❌ 不保证原子性volatile 能保证原子性吗内存屏障StoreStore、StoreLoad、LoadLoad、LoadStorevolatile 如何禁止指令重排Happens-Beforevolatile写 → volatile读volatile 的 Happens-Before 规则DCL单例必须加 volatile 防止半初始化对象暴露DCL 单例为什么必须加 volatile 阅读完整文章第54篇AQS 抽象队列同步器 查看完整文章核心概念一句话总结高频面试提问AQS 定义JUC 并发体系的底层基石AQS 是什么核心三要素volatile int state CLH双向队列 模板方法模式AQS 的核心思想独占模式同一时刻只有一个线程能获取ReentrantLockAQS 的独占模式共享模式同一时刻多个线程可同时获取Semaphore/CountDownLatchAQS 的共享模式CLH队列FIFO双向链表存储等待线程每个线程封装为NodeCLH 队列是什么可重入性实现state 计数当前线程是持有者时 stateReentrantLock 如何实现可重入 阅读完整文章第55篇线程池 ThreadPoolExecutor 查看完整文章核心概念一句话总结高频面试提问七大参数corePoolSize、maxPoolSize、keepAliveTime、unit、workQueue、threadFactory、handlerThreadPoolExecutor 七大参数四步执行流程核心线程 → 任务队列 → 非核心线程 → 拒绝策略任务提交后的执行流程四种拒绝策略AbortPolicy、CallerRunsPolicy、DiscardPolicy、DiscardOldestPolicy线程池的拒绝策略有哪些Executors陷阱无界队列→OOM无限线程→资源耗尽为什么禁止使用 Executors线程数公式CPU密集型CPU核数1IO密集型CPU核数×2corePoolSize 如何设置生命周期shutdown优雅关闭、shutdownNow立即关闭shutdown 和 shutdownNow 的区别 阅读完整文章第56篇死锁与排查工具 查看完整文章核心概念一句话总结高频面试提问四大必要条件互斥 持有并等待 不可剥夺 循环等待死锁的四个必要条件jstack 排查jps -l找 PID →jstack -l PID→ 搜索 “deadlock”如何排查 Java 死锁预防策略统一锁顺序、tryLock 超时、减少锁粒度如何预防死锁死锁 vs 活锁死锁永久阻塞活锁不断重试失败死锁和活锁的区别 阅读完整文章第57篇CompletableFuture 异步编程 查看完整文章核心概念一句话总结高频面试提问Future 四大痛点阻塞等待、无法链式、无法组合、异常难处理CompletableFuture 比 Future 好在哪任务创建supplyAsync有返回值、runAsync无返回值如何创建异步任务thenApply vs thenComposethenApply 同步转换thenCompose 串联异步任务thenApply 和 thenCompose 的区别任务组合thenCombine并行合并、allOf等全部、anyOf等任意如何组合多个异步任务异常处理exceptionally兜底、handle都处理、whenComplete收尾异常处理三件套的区别线程池业务异步不用 commonPool自建线程池区分 CPU/IOCompletableFuture 默认用什么线程池 阅读完整文章第58篇原子类与 CAS 查看完整文章核心概念一句话总结高频面试提问CAS 三要素内存位置 V、预期值 A、新值 BCAS 的三要素是什么CAS 底层CPU 原子指令x86: lock cmpxchgCAS 如何保证原子性原子类五大分类基本类型、数组、引用、属性更新器、高性能累加器原子类有哪些ABA 问题值 A→B→ACAS 误判ABA 问题是什么如何解决AtomicStampedReference版本号解决 ABA如何解决 ABA 问题LongAdder分段累加高并发计数性能提升4倍LongAdder 为什么比 AtomicLong 快VarHandleJDK 23 正式替代 UnsafeUnsafe 用什么替代 阅读完整文章第59篇ThreadLocal 原理与内存泄漏 查看完整文章核心概念一句话总结高频面试提问核心设计空间换时间每个线程独立变量副本ThreadLocal 是什么JDK 1.8架构Thread 对象持有 ThreadLocalMapThreadLocal 的数据存在哪里Entry 结构key弱引用 value强引用Entry 的 key 为什么用弱引用内存泄漏根因key 被 GC 回收 → value 强引用残留 → 线程存活 → 永不释放ThreadLocal 的内存泄漏是怎么产生的根治方案try-finally 保证 remove() 执行如何正确使用 ThreadLocalremove vs set(null)remove 删除整个 Entryset(null) 只设值为 nullremove() 和 set(null) 的区别InheritableThreadLocal父子线程传递子线程如何获取父线程的 ThreadLocalTransmittableThreadLocal线程池场景上下文传递阿里开源线程池中如何传递 ThreadLocal 阅读完整文章第60篇并发编程面试压轴题 查看完整文章核心概念一句话总结高频面试提问30 高频题覆盖8大模块多线程面试考点有哪些锁升级无锁→偏向→轻量→重量synchronized 锁升级过程AQS 核心state CLH队列 模板方法AQS 的核心思想线程池参数七大参数 四步流程 拒绝策略ThreadPoolExecutor 核心参数CAS 三要素内存位置 V、预期值 A、新值 BCAS 的三要素ThreadLocal 泄漏弱引用 key 强引用 value 忘记 removeThreadLocal 内存泄漏 阅读完整文章 本阶段高频面试题精选30道必背线程基础篇5题Java 线程有哪几种状态→ 6种NEW → RUNNABLE → BLOCKED/WAITING/TIMED_WAITING → TERMINATEDsleep()和wait()的区别→ sleep 不释放锁wait 释放锁sleep 时间到自醒wait 需 notifystart()和run()的区别→ start 启动新线程run 是普通方法调用创建线程有几种方式→ Thread、Runnable、Callable、线程池虚拟线程和平台线程的区别→ 虚拟线程轻量几百字节M:N 调度适合高并发 I/O锁与 JMM 篇6题synchronized 锁升级过程→ 无锁→偏向锁→轻量级锁→重量级锁单向不可逆synchronized 的锁存在哪里→ 对象头的 Mark Word64位JVM占8字节volatile 能保证原子性吗→ 不能i是读-改-写三步volatile 不保证volatile 如何保证可见性→ 写即刷主存、读即强制重载 内存屏障JMM 和 JVM 内存结构的区别→ JMM 管“怎么看见”JVM 内存结构管“存哪里”synchronized 和 ReentrantLock 的区别→ synchronized JVM内置有锁升级ReentrantLock API支持超时/中断AQS 与并发工具篇5题AQS 的核心三要素→ volatile int state CLH 双向队列 模板方法模式AQS 的独占模式和共享模式→ 独占ReentrantLock共享Semaphore/CountDownLatchCountDownLatch 和 Semaphore 的区别→ CountDownLatch 倒计数不可重置Semaphore 许可可增减AQS 的 CLH 队列是什么→ FIFO 双向链表存储等待线程ReentrantLock 的可重入性如何实现→ state 计数当前线程持有则 state线程池篇4题ThreadPoolExecutor 七大参数→ corePoolSize、maxPoolSize、keepAliveTime、unit、workQueue、threadFactory、handler任务提交后的执行流程→ 核心线程 → 任务队列 → 非核心线程 → 拒绝策略为什么禁止使用 Executors→ 无界队列 OOM / 无限线程资源耗尽corePoolSize 如何设置→ CPU密集型CPU核数1IO密集型CPU核数×2死锁与异步篇5题死锁的四大必要条件→ 互斥 持有并等待 不可剥夺 循环等待如何排查死锁→jps找 PID →jstack -l PID→ 搜索 “deadlock”CompletableFuture 和 Future 的区别→ Future 阻塞无法链式组合CompletableFuture 支持链式/组合/回调thenApply和thenCompose的区别→ thenApply 同步转换thenCompose 串联异步任务allOf和anyOf的区别→ allOf 等全部anyOf 等任意一个CAS 与原子类篇4题CAS 的三要素是什么→ 内存位置 V、预期值 A、新值 BABA 问题是什么如何解决→ 值 A→B→ACAS 误判 → AtomicStampedReference版本号LongAdder 为什么比 AtomicLong 快→ 分段累加分散竞争Unsafe 用什么替代→ VarHandleJDK 9 引入JDK 23 确立为唯一推荐ThreadLocal 篇4题ThreadLocal 内存泄漏是怎么产生的→ Entry key 弱引用被 GC 回收value 强引用残留 → 线程存活 → 永不释放Entry 的 key 为什么用弱引用→ 允许 ThreadLocal 对象被 GC 回收弱引用只是“兜底”如何正确使用 ThreadLocal→ try-finally 保证 remove() 执行线程池中如何使用 ThreadLocal→ 每次任务结束必须 remove()防止脏读和内存泄漏InheritableThreadLocal 和 TransmittableThreadLocal 的区别→ Inheritable 父子线程TTL 线程池场景阿里开源 避坑清单本阶段血泪教训坑点错误做法正确做法synchronized 锁对象为 nullsynchronized(null)锁对象必须是非 null 引用线程池 ExecutorsExecutors.newFixedThreadPool()无界队列手动 ThreadPoolExecutor 有界队列volatile 做计数器volatile int count用 AtomicInteger 或 LongAdderCompletableFuture 不设超时不设超时可能永久阻塞completeOnTimeout()或orTimeout()CompletableFuture 异常未处理链中不处理异常exceptionally或handleCompletableFuture 用 commonPool业务异步用默认线程池自建业务线程池ThreadLocal 用完不 remove线程池场景忘记清理try-finally 保证 remove()ThreadLocal 存大对象存放大对象导致内存占用高存轻量级 key大对象放缓存ReentrantLock unlock 不写 finally异常时不释放锁在finally中unlock()死锁只用 jstack 不分析只看到死锁不改代码分析锁顺序统一获取顺序AtomicStampedReference 版本号不递增用 0/1 交替仍可能漏判版本号必须严格递增LongAdder 依赖精确值sum()做精确计算需要精确值用 AtomicLong 或加锁虚拟线程用 synchronized高并发场景用 synchronized用 ReentrantLock 避免 Pinning 下阶段预告第61~70篇JVM调优与故障排查并发编程与 JUC 专题已收官JVM 调优与故障排查专题第61~70篇即将开启第61篇JVM 内存区域JDK 8 堆、元空间、虚拟机栈、程序计数器第62篇垃圾回收器详解Serial、Parallel、CMS、G1、ZGC第63篇GC 调优实战日志分析、JVM 参数、年轻代/老年代调整第64篇类加载器与热部署双亲委派、Tomcat 热部署、自定义类加载器第65篇OOM 与内存泄漏排查MAT、jmap、jstat、Arthas第66篇JIT 编译与性能优化热点代码、逃逸分析、栈上分配第67篇JVM 面试压轴题关注专栏 订阅第一时间收到更新 福利本阶段全套知识点 PDF为方便你随时复习我把这 10 篇的核心知识点、面试题、避坑清单整理成了一份PDF速查手册并发编程与JUC篇。获取方式关注我的CSDN账号点击关注在本文评论区留言“并发通关”或私信我我会将PDF下载链接发送给你 下一步行动收藏本文随时回看知识点速查表和面试题订阅专栏确保后续 JVM 篇更新时第一时间收到转发给正在学 Java 的朋友帮他们也少走弯路领取PDF评论区留言“并发通关”免费获取本阶段全套知识点手册种一棵树最好的时间是10年前其次是现在。并发编程 10 篇已通关JVM 调优专题等着你继续征服 回到完整目录导航 | 订阅进阶篇 本总结文章属于《Java 100 天进阶之路 | 从入门到上岗就业》系列。并发编程与 JUC 阶段第51~60篇已收官JVM 调优与故障排查专题即将启航。感谢一路同行我们下一阶段见