
📖 资源简介
最近有朋友问线程八大核心+Java并发原理及企业级并发解决方案的学习资料,正好手头有一套比较完整的,就整理出来分享给大家。
✨ 资源亮点
- 体系完整:全套129节视频,从入门到进阶都有覆盖,不是零散的片段。
- 模块丰富:涵盖15个学习模块,知识点覆盖全面。
- 面试导向:每一核心章节都配有高频面试题串讲,适合备战国网、中大厂后端岗位。
- 底层深入:不止停留在 API 使用,还讲到 JMM、重排序、happens-before、对象头 monitor 等底层原理。
📚 课程内容
课程大纲
- 第1章 开宗明义
- 第2章 线程八大核心纵观全貌
- 第3章 核心1:实现多线程的正确姿势【解读官方文档】
- 第4章 核心2:开启多线程启动的世界
- 第5章 核心3:线程停止、中断之最佳实践【填”坑”式教学,从错误到正确】
- 第6章 核心4:图解线程生命周期【适用于面试】
- 第7章 核心5:趣解Thread和Object类中线程相关方法
- 第8章 核心6:一网打尽线程属性
- 第9章 核心7:线程异常处理知多少?
- 第10章 核心8:追寻并发的崇高理想-线程安全【工作常用】
… 等共15个模块
资源清单
| 类型 | 数量 |
|---|---|
| 视频教程 | 129 节 |
| 压缩文件 | 0 个 |
| 合计 | 129 |
一、为什么必须吃透 Java 并发
很多初中级工程师对多线程的认知停留在”new Thread().start() 就是起线程”、”synchronized 就是加锁”。但一旦遇到线上偶发的”超卖””账不平””接口莫名其妙超时””CPU 飙高”,往往就束手无策。原因就在于:并发 Bug 不是每次必现,而是在特定时序下才暴露,一旦上线,复现成本极高。
这套课程围绕”线程八大核心”展开,把 JDK 官方文档中关于 java.lang.Thread 的关键点逐一拆开,再延伸到 JMM 与死锁治理,非常适合:
- 准备 Java 后端、中间件、基础架构岗位面试的同学;
- 已经在业务里用过线程池,但说不清
volatile为什么不能保证a++原子性的工程师; - 想从”会写 CRUD”进阶到”能写高并发服务”的开发者。
下面把这套课程里最容易被面试官追问、也最容易写歪的几个核心知识点梳理一遍,配合可运行示例,方便你对着课程视频对照学习。
二、线程六种状态与 start() vs run()
Thread.getState() 返回的是 Thread.State 枚举,只有六种,不要和操作系统层面的”就绪/运行/阻塞”混为一谈:
| 状态 | 含义 | 典型触发场景 |
|---|---|---|
NEW |
刚 new 出来,还没调用 start() |
new Thread(t).run() 之前 |
RUNNABLE |
可运行(含操作系统层面的就绪与运行中) | 调用 start() 之后 |
BLOCKED |
等待进入 synchronized 块 |
争抢 monitor 锁失败 |
WAITING |
无限期等待被唤醒 | wait() / join() 无超时 |
TIMED_WAITING |
限时等待 | sleep(n) / wait(n) / join(n) |
TERMINATED |
线程执行结束 | run() 正常或异常退出 |
public class ThreadStatesDemo {
public static void main(String[] args) throws InterruptedException {
Thread t = new Thread(() -> {
try { TimeUnit.SECONDS.sleep(1); } catch (InterruptedException ignored) {}
});
System.out.println("before start: " + t.getState()); // NEW
t.start();
System.out.println("running: " + t.getState()); // RUNNABLE
t.join();
System.out.println("after join: " + t.getState()); // TERMINATED
}
}
start() vs run() 是必考题:
start()是 native 方法,由 JVM 调用 OS 去真正创建一条新线程,新线程再回调run();- 直接调用
run()只是普通方法调用,仍然在当前主线程里同步执行,不会产生新线程。
三、中断机制:interrupt() / isInterrupted() / interrupted()
Thread.stop() 已被废弃,正确的停止姿势是协作式中断。三个 API 必须分清楚:
| 方法 | 作用对象 | 语义 |
|---|---|---|
t.interrupt() |
目标线程 t | 把 t 的中断标志位置为 true;若 t 正阻塞在 sleep/wait/join 上,会抛出 InterruptedException 并清除中断标志 |
t.isInterrupted() |
目标线程 t | 读取 t 的中断标志,不清除 |
Thread.interrupted() |
当前线程 | 读取当前线程中断标志,然后立即清除为 false(静态方法) |
public class InterruptDemo {
public static void main(String[] args) throws InterruptedException {
Thread t = new Thread(() -> {
while (!Thread.currentThread().isInterrupted()) {
// 业务循环
}
System.out.println("线程退出,isInterrupted=" + Thread.interrupted());
});
t.start();
Thread.sleep(100);
t.interrupt(); // 发出中断信号
t.join();
}
}
踩坑点:InterruptedException 一旦抛出,JVM 会把中断标志清掉。此时要么在 catch 里再次 Thread.currentThread().interrupt() 恢复中断,要么直接向上抛出,不要吞掉。
四、wait / notify / notifyAll 与 sleep 的区别
这四个方法都是 Object 上的,不是 Thread 上的,这是新手最容易搞错的一点。
- 必须先
synchronized (lock)拿到这把锁,才能调用lock.wait()/lock.notify();否则抛IllegalMonitorStateException。 wait()会释放 monitor 锁,进入该对象的等待队列;被notify/notifyAll唤醒后,还要重新竞争锁才能继续执行。notify()随机唤醒一个等待线程,notifyAll()唤醒全部;工程上优先用notifyAll(),避免”信号丢失”。Thread.sleep(n)不释放任何锁,只是让当前线程让出 CPU 时间片。
经典生产者-消费者骨架:
public class ProducerConsumer {
private final Queue<String> queue = new ArrayDeque<>();
private final int capacity = 5;
public void produce() throws InterruptedException {
synchronized (this) {
while (queue.size() == capacity) wait(); // 注意是 while 不是 if
queue.add("item-" + System.nanoTime());
notifyAll();
}
}
public String consume() throws InterruptedException {
synchronized (this) {
while (queue.isEmpty()) wait();
String x = queue.poll();
notifyAll();
return x;
}
}
}
注意 while 循环——被唤醒的线程在重新拿到锁后,必须再判断一次条件,这叫”虚假唤醒“防御。
五、volatile:可见性 + 禁止重排序,但不保证原子性
volatile 解决两个问题:
- 可见性:一个线程写
volatile变量,对其他读它的线程立刻可见(写后立即刷主存、读时强制从主存读); - 禁止指令重排序:通过插入内存屏障,避免编译器/CPU 把前后语句乱序。
但它不能保证复合操作的原子性,所以 i++(读-改-写三步)在多线程下仍然会丢数据:
public class VolatileCounter {
private volatile int count = 0;
public void incr() { count++; } // 仍然线程不安全!
}
正确做法:用 AtomicInteger(CAS)或者 synchronized。
volatile 最经典的实战场景是双重检查锁定(DCL)单例:
public class Singleton {
private static volatile Singleton instance;
private Singleton() {}
public static Singleton getInstance() {
if (instance == null) { // 第一次检查:避免每次进锁
synchronized (Singleton.class) {
if (instance == null) { // 第二次检查:防止并发重复创建
instance = new Singleton(); // 没有 volatile 会出现"半初始化"对象
}
}
}
return instance;
}
}
new 操作在字节码层面分”分配内存 → 初始化对象 → 引用指向地址”三步,没有 volatile 时第三步可能先于第二步发生,别的线程就会拿到一个还没构造完的对象。
六、synchronized 与死锁治理
synchronized 基于对象头中的 Mark Word 和 Monitor 实现,是可重入的:同一线程再次进入同一把锁时,计数加一,退出时减一,归零才真正释放。
死锁产生的四个必要条件(同时满足才会死锁):
- 互斥:资源同一时刻只能被一个线程占用;
- 持有并等待:拿着 A 锁的同时去等 B 锁;
- 不可剥夺:锁只能由持有者主动释放;
- 循环等待:线程 A 等 B 持有的锁,B 等 C 的,C 又等 A 的。
定位死锁有两种标配手段:
# 1. jstack 直接 dump

jps -l # 找到进程 PID
jstack <PID> > dump.txt # 末尾会直接打印 "Found Java-level deadlock"
# 2. 代码内用 ThreadMXBean 定时检测

ThreadMXBean mbean = ManagementFactory.getThreadMXBean();
long[] deadlocked = mbean.findDeadlockedThreads();
避免死锁的工程经验:
- 所有线程按固定顺序申请锁(比如始终先锁
accountA,再锁accountB,按 hashCode 排序); - 用
tryLock(timeout)替代无超时阻塞,超时直接放弃重试; - 减少临界区粒度,能不加锁就不加锁,能用 CAS 就不用锁。
七、学习路线建议
按这套课程的章节顺序,建议这样学:
- 先建立直觉(第 1–4 章):跑通
Thread/Runnable/Callable三种写法,搞清楚start()和run()的本质区别; - 搞懂线程控制(第 5–7 章):中断、状态机、
wait/notify/join/sleep/yield,每个 API 都要能画出来”调用后状态怎么流转”; - 理解线程安全(第 8–10 章):属性、异常处理、可见性/原子性/有序性三大问题,重点搞透
a++为什么会丢; - 下沉到 JMM(第 12–13 章):主内存/工作内存、happens-before 八条规则、
volatile与 DCL 单例; - 企业级问题(第 14 章):死锁四条件、
jstack定位、哲学家就餐、活锁与饥饿; - 复盘(第 11、15 章):对着思维导图把八大核心和面试题再过一遍。
八、高频面试题速查
- 线程有哪几种状态?
BLOCKED和WAITING有什么区别? start()能不能调用两次?为什么?interrupt()一定会立刻停止线程吗?InterruptedException抛出后中断标志还在吗?wait()、notify()为什么必须在synchronized块里?sleep()要不要?volatile能保证原子性吗?为什么 DCL 单例必须加volatile?synchronized是可重入的吗?底层怎么实现的?- 死锁的四个必要条件?生产环境怎么排查?
- 什么是 happens-before?它和 JMM 是什么关系?
九、写在最后
并发不是”背 API”,而是建立对时序的直觉。建议你在跟着视频学的时候,每学一个概念就自己写一段最小复现代码,用 jstack、jconsole、Arthas 去观察线程状态,比单纯看视频记得牢十倍。把这 129 节扎扎实实过完,再配合 JUC 包(AQS、ThreadPoolExecutor、ConcurrentHashMap)继续深入,后端并发这条线就基本打通了。
📁 目录结构
目录概览
📋 点击展开查看课程模块大纲
[V2]线程八大核心+Java并发原理及企业级并发解决方案/
├── 第1章 开宗明义
├── 第2章 线程八大核心纵观全貌
├── 第3章 核心1:实现多线程的正确姿势
├── 第4章 核心2:开启多线程启动的世界
├── 第5章 核心3:线程停止、中断之最佳实践
├── 第6章 核心4:图解线程生命周期
├── 第7章 核心5:Thread 和 Object 类线程相关方法
├── 第8章 核心6:线程属性
├── 第9章 核心7:线程异常处理
├── 第10章 核心8:线程安全
├── 第11章 多线程八大核心面试总结
├── 第12章 并发编程底层原理(上):JMM / 重排序 / 可见性 / happens-before
├── 第13章 并发编程底层原理(下):volatile / 原子性 / 单例与 JMM
├── 第14章 并发死锁问题与企业级解决方案
└── 第15章 思维导图助你攻克并发
资源获取
💡 建议:尽快保存到本地网盘或电脑,避免分享链接后期失效。
整理不易,如果对你有帮助,欢迎分享给更多需要的朋友。












-800x600.png)


请登录后查看评论内容