Java 并发编程进阶:深挖 AQS 原理与源码实战

很多开发者虽然能调用 `synchronized` 或 `ReentrantLock`,但遇到复杂的线程协同场景时,往往只能死记硬背 API,一旦并发出现死锁或性能瓶颈就束手无策。这门课专门解决“只会用锁,不懂锁原理”以及“面对并发容器源码不敢看”的痛点。课程不讲虚头巴脑的应用层技巧,而是直接切中 Java 并发编程最核心的抽象组件——AQS(同步器),带你从底层机制去理解为什么 Java 的并发工具都长得那么像。

先建模型再啃源码,适合有基础但不懂底层的同学

这门课适合已经熟悉 Java 语法,但并发编程经验不足,或者想从初级开发转岗后端核心岗的学员。如果你还分不清 `wait/notify` 和 `Condition` 的底层差异,或者对 `ReentrantLock` 的公平与非公平策略感到困惑,建议严格按照以下顺序学习:首先快速浏览第一章中“回顾对象锁工作原理”和"AQS 概念”部分,不要急着看代码,先建立“状态位 + 队列”的宏观认知模型。只有先搞懂了 AQS 是如何通过一个 `int` 变量管理共享状态,再通过队列管理线程等待,后续看源码才能豁然开朗,否则直接硬啃代码会非常痛苦且容易走火入魔。

拒绝纸上谈兵,必须结合源码推演与调试

学完这套内容,你将不再满足于阅读官方文档,而是具备独立阅读并解析 AQS 核心源码的能力。课程会带你逐行拆解 `State` 的原子性管理逻辑、`acquire` 方法的阻塞唤醒机制以及 `Node` 节点在同步队列中的入队出队流转规则。更重要的是,你能清晰画出共享锁与独占锁在不同模式下,线程状态如何变化的完整路径。请配合视频中的源码片段进行二次开发练习,你需要能在面试现场手绘 AQS 状态流转图,并准确解释 CAS 操作在其中的具体作用。资料包中的源码旨在辅助验证讲师的讲解逻辑,请务必自行对照 JDK 真实源码进行断点调试,只有亲手修改过 `Node` 状态并观察到线程行为变化,才算真正掌握了并发锁的精髓。

课程目录

01 第一章 同步器AQS
|   ├──01 AQS的概念和原理
|   |   ├──05 1-1-4AQS源码解析之同步状态的原子性管理.mp4  8.14M
|   |   ├──06 1-1-5AQS源码解析之acquire方法源码简介.mp4  16.37M
|   |   ├──07 1-1-6AQS源码解析之release方法源码简介.mp4  11.32M
|   |   ├──08 1-1-7AQS源码解析之acquireShared和releaseShared方法简介.mp4  15.15M
|   |   ├──09 1-1-8AQS源码解析之acqureiInterruptibly和tryAcquireNanos方法简介.mp4  15.67M
|   |   ├──【免费课程
www.ruike1.com
】01 1-0-1课程介绍和学习目标.mp4  7.84M
】02 1-1-1AQS的概念和工作模式.mp4  9.57M
】03 1-1-2回顾对象锁的工作原理.mp4  15.22M
|   |   └──【免费课程
】04 1-1-3AQS的核心组件及工作流程.mp4  7.64M
|   └──02 AQS的数据结构及使用方式、Lock框架的再认识
|   |   ├──01 1-2-1AQS队列数据结构的基本介绍.mp4  5.67M
|   |   ├──02 1-2-2Node内部类源码解析.mp4  10.15M
|   |   ├──03 1-2-3同步队列节点的入队操作.mp4  32.27M
|   |   ├──06 1-2-6等待队列节点的出队操作.mp4  20.85M
|   |   ├──07 1-2-7共享模式下节点的入队与出队操作.mp4  27.34M
|   |   ├──08 1-2-8关于节点的取消状态.mp4  54.28M
|   |   ├──09 1-3-1AQS的设计模式之模板方法.mp4  33.39M
|   |   ├──10 1-3-2自定义一个简单的互斥锁.mp4  45.98M
|   |   ├──11 1-3-3自定义一个可重入的互斥锁.mp4  37.08M
|   |   ├──12 1-3-4共享锁的实现思路及注意事项.mp4  23.87M
|   |   ├──13 1-4-1Lock和synchronized的区别.mp4  26.18M
|   |   ├──14 1-4-2公平与非公平的底层支持:可闯入策略.mp4  34.28M
|   |   ├──16 1-4-4读写锁ReentrantReadWriteLock的基本使用.mp4  18.02M
|   |   ├──17 1-4-5读写锁的适用性与关注点.mp4  18.22M
|   |   ├──18 1-4-6Callable、Future和FutureTask回顾.mp4  24.73M
|   |   ├──19 1-4-7ForkJoin框架与工作秘取的基本概念.mp4  7.55M
|   |   ├──20 1-4-8ForkJoinTask与两个常用子类RecursiveTask、RecursiveAction源码概述.mp4  31.04M
|   |   ├──21 1-4-9ForkJoin案例:分别使用单线程和fork-join框架运算数组元素之和.mp4  60.17M
|   |   ├──22 1-4-10ForkJoin案例:使用RecursiveAction遍历目录(含子目录)打印指定类型文件.mp4  30.69M
】04 1-2-4同步队列节点的出队操作.mp4  21.11M
】05 1-2-5等待队列节点的入队操作.mp4  23.97M
】15 1-4-3使用synchronized关键字实现读多写少的测试.mp4  30.75M
02 第二章 并发容器
|   ├──00 资料
|   |   └──Java并发编程高阶技术实践
|   └──01 并发容器-课程所有资料在本节下载
|   |   ├──01 2-0-1课程介绍与学习目标.mp4  4.47M
|   |   ├──02 2-1-1ConcurrentHashMap预备知识:hash算法和位运算.mp4  12.56M
|   |   ├──03 2-1-2ConcurrentHashMap数据结构预览.mp4  11.96M
|   |   ├──04 2-1-3ConcurrentHashMap在jdk1.7及以前的实现原理概述.mp4  7.88M
|   |   ├──05 2-1-4ConcurrentHashMap在jdk1.7及以前的初始化源码解析.mp4  30.25M
|   |   ├──06 2-1-5ConcurrentHashMap在jdk1.7及以前的get()方法源码解析.mp4  35.80M
|   |   ├──07 2-1-6ConcurrentHashMap在jdk1.7及以前的put()方法源码解析.mp4  40.30M
|   |   ├──08 2-1-7ConcurrentHashMap在jdk1.7及以前的扩容机制和size()方法源码解析.mp4  33.44M
|   |   ├──09 2-1-8ConcurrentHashMap在jdk8及以后的实现原理概述.mp4  14.75M
|   |   ├──10 2-1-9ConcurrentHashMap在jdk8及以后的初始化和put()方法源码解析.mp4  63.95M
|   |   ├──11 2-1-10ConcurrentHashMap在jdk8及以后的get()方法源码解析.mp4  13.32M
|   |   ├──12 2-1-11ConcurrentHashMap在jdk8及以后的扩容机制和size()方法源码解析.mp4  42.42M
|   |   ├──13 2-1-12ConcurrentHashMap在jdk8及以后的总结.mp4  26.94M
|   |   ├──14 2-2-1跳表SkipList的工作原理.mp4  10.96M
|   |   ├──15 2-2-2无界非阻塞队列ConcurrentLinkedQueue简介.mp4  6.66M
|   |   ├──16 2-2-3写时复制容器简介.mp4  5.22M
|   |   ├──17 2-3-1阻塞队列的概念及由来.mp4  6.18M
|   |   ├──18 2-3-2阻塞队列的常用方法辨析.mp4  43.16M
|   |   ├──19 2-3-3常见阻塞队列及各自特点辨析.mp4  72.36M
|   |   ├──20 2-3-4使用DelayQueue实现延时订单-延时队列元素工具类定义.mp4  43.43M
|   |   ├──21 2-3-5使用DelayQueue实现延时订单-生产者和消费者线程定义及测试.mp4  44.92M
|   |   └──22 2-3-6阻塞队列的底层实现:显示锁+等待通知机制.mp4  13.66M
03 第三章 线程池
|   └──01 线程池
|   |   ├──01 3-0-1课程介绍与学习目标.mp4  6.18M
|   |   ├──02 3-1-1线程池的概念和好处.mp4  13.93M
|   |   ├──03 3-1-2自定义线程池:思路分析.mp4  15.05M
|   |   ├──04 3-1-3自定义线程池:创建线程池,初始化工作线程.mp4  30.45M
|   |   ├──05 3-1-4自定义线程池:工作线程从任务队列中获取任务并执行.mp4  26.83M
|   |   ├──06 3-1-5自定义线程池:提供execute方法供调用者执行任务.mp4  13.84M
|   |   ├──07 3-1-6自定义线程池:提供destroy方法用于销毁线程池.mp4  23.18M
|   |   ├──08 3-1-7自定义线程池:测试及线程池工作流程.mp4  50.06M
|   |   ├──09 3-2-1ThreadPoolExecutor源码分析:初始化线程池参数.mp4  71.45M
|   |   ├──10 3-2-2ThreadPoolExecutor源码分析:提交任务execute和submit方法.mp4  35.14M
|   |   ├──11 3-2-3ThreadPoolExecutor源码分析:关闭线程池shutdown和shutdowNow方法.mp4  7.27M
|   |   ├──12 3-2-4线程池工作机制.mp4  6.75M
|   |   ├──13 3-2-5使用ThreadPoolExecutor创建线程池并使用.mp4  33.10M
|   |   ├──14 3-2-6提交带返回值的任务到ThreadPoolExecutor线程池.mp4  28.20M
|   |   ├──15 3-2-7线程池的关闭:shutdown与shutdownNow方法的使用.mp4  28.07M
|   |   ├──16 3-2-8合理配置线程池.mp4  18.06M
|   |   ├──17 3-3-1系统预定义线程池简介.mp4  22.43M
|   |   ├──18 3-3-2定时任务ScheduledThreadPoolExecutor用法.mp4  61.43M
|   |   ├──19 3-3-3定时任务ScheduledThreadPoolExecutor异常处理.mp4  24.77M
|   |   ├──20 3-3-4Executor框架继承体系和使用流程.mp4  27.28M
|   |   ├──21 3-3-5CompletionService按线程池中任务完成顺序获取结果.mp4  40.14M
|   |   └──22 3-3-6CompletionService实现原理.mp4  18.50M
04 第四章 并发安全
|   └──01 并发安全
|   |   ├──01 4-0-1并发安全:课程简介和学习目标.mp4  7.64M
|   |   ├──02 4-1-1什么是类的线程安全.mp4  7.47M
|   |   ├──03 4-1-2类的线程安全:无状态、加锁和CAS操作.mp4  11.20M
|   |   ├──04 4-1-3类的线程安全:让类不可变 - 属性加final.mp4  24.86M
|   |   ├──05 4-1-4类的线程安全:让类不可变 - 不提供修改属性的方式.mp4  19.30M
|   |   ├──06 4-1-5类的线程安全:栈封闭.mp4  26.93M
|   |   ├──07 4-1-6类的线程安全:volatile、安全的发布、ThreadLocal.mp4  17.69M
|   |   ├──08 4-2-1死锁产生的原因.mp4  4.71M
|   |   ├──09 4-2-2常见的死锁发生的两个场景.mp4  26.41M
|   |   ├──10 4-2-3动态顺序死锁的产生.mp4  17.28M
|   |   ├──11 4-2-4动态顺序死锁的解决方案一:内在排序.mp4  46.14M
|   |   ├──12 4-2-5动态顺序死锁的解决方案二:Lock.tryLock方法.mp4  35.81M
|   |   ├──13 4-2-6活锁与饥饿.mp4  25.22M
|   |   ├──14 4-3-1衡量多线程引用性能的指标与影响因素.mp4  16.12M
】15 4-3-2锁优化:缩小锁的范围.mp4  32.32M
】16 4-3-3锁优化:减少锁的粒度.mp4  20.92M
】17 4-3-4锁优化:锁分段和替换独占锁.mp4  7.93M
】18 4-3-5常见的两种单例设计模式.mp4  13.40M
】19 4-3-6使用枚举实现单例:防止反射攻击.mp4  8.95M
】20 4-3-7懒汉式单例模式:双重检查确保并发安全.mp4  13.20M
】21 4-3-8懒汉式单例模式:双重检查的问题及解决方案.mp4  15.63M
】22 4-3-9单例设计模式大杀器:延迟占位模式.mp4  24.65M
05 第五章 Java内存模型
|   └──01 Java内存模型
|   |   ├──01 5-0-1课程介绍与学习目标.mp4  6.50M
|   |   ├──02 5-1-1现代计算机物理内存模型.mp4  15.58M
|   |   ├──03 5-1-2物理内存模型带来的问题.mp4  16.37M
|   |   ├──04 5-2-1并发编程模型的分类.mp4  10.55M
|   |   ├──05 5-2-3Java内存模型图示.mp4  11.45M
|   |   ├──06 5-2-4Java线程通信的实现.mp4  4.50M
|   |   ├──07 5-2-5Java虚拟机的体系结构.mp4  12.49M
|   |   ├──08 5-2-6JMM在JVM中的实现:栈【1】.mp4  10.05M
|   |   ├──09 5-2-7JMM在JVM中的实现:堆.mp4  4.91M
|   |   ├──10 5-2-8JMM在JVM中的实现:方法区.mp4  15.88M
|   |   ├──11 5-2-9堆栈溢出异常:StackOverFlowError和OutOfMemoryError.mp4  19.89M
|   |   ├──12 5-2-10基于共享内存的JMM的问题:可见性和竞争.mp4  5.89M
|   |   ├──13 5-2-11重排序的概念和分类.mp4  12.77M
|   |   ├──14 5-2-12重排序与依赖性:数据依赖性.mp4  16.45M
|   |   ├──15 5-2-13重排序与依赖性:控制依赖性与as-if-serieal语义.mp4  14.58M
|   |   ├──16 5-2-14并发下重排序的问题.mp4  18.05M
|   |   ├──17 5-2-15并发下重排序问题的解决方案:临界区.mp4  8.34M
|   |   ├──18 5-2-16并发下重排序问题的解决方案:内存屏障.mp4  15.09M
|   |   ├──19 5-3-1Happens-Before规则的概念.mp4  7.62M
|   |   ├──20 5-3-2无须任何同步手段就可以保证的Happens-Before规则.mp4  13.66M
|   |   ├──21 5-3-3final关键字的内存语义.mp4  12.00M
|   |   ├──22 5-3-4volatile关键字的内存语义.mp4  4.34M
|   |   ├──23 5-3-5volatile关键字内存语义的实现.mp4  10.27M
|   |   ├──24 5-4-1锁的内存语义.mp4  4.18M
|   |   └──25 5-4-2synchronized的实现原理.mp4  6.62M
——/hm-Java并发编程进阶技术实践/├──01 第一章 同步器AQS  |   ├──01 AQS的概念和原理  |   |   ├──05 1-1-4AQS源码解析之同步状态的原子性管理.mp4  8.1 hm-Java并发编程进阶技术实践