面试被问到「synchronized 锁的是对象还是代码」,你能答上来,但面试官追问一句「锁升级过程里偏向锁什么时候撤销」,就开始支吾了。或者你在项目里写了几年 Thread、ExecutorService,可一旦线上出现线程卡死、CPU 飙高,翻 dump 文件时才发现自己对线程状态、锁持有关系其实没什么底气。这门课就是冲着这类缺口来的——不是从零讲什么是线程,而是把你「用过但说不清」的那部分补齐。

先确认自己缺的是哪一块

Java 并发这块知识,很多人的状态是「碎片化」的:用线程池知道调 Executors.newFixedThreadPool,但答不出核心线程数、阻塞队列、拒绝策略三者怎么配合;知道 volatile 保证可见性,但说不清它和 synchronized 在内存语义上的差别。这门课按三条线来组织:基础用法、内存模型、死锁与线程状态。你可以对照一下:

  • 能写出线程的几种创建方式,但被问「start 和 run 的区别,run 直接调用会怎样」时只知道结论、讲不出过程;
  • 背过 JMM 的 happens-before 八条规则,但遇到具体的指令重排、内存屏障问题就绕不过去;
  • 知道死锁的四个必要条件,但真要在代码里定位死锁、判断是等待还是死循环,手上没方法。

以上任何一条卡住,都说明该补的不是「多线程入门」,而是从用法往原理走的那一步。

线程的中断、等待与状态,是面试的密集区

线程状态这块,面试官特别喜欢从边角切入:wait 和 sleep 释放锁的区别、join 期间线程处于什么状态、线程被中断后 InterruptedException 抛出的位置和「恢复中断标记」为什么是推荐做法。这些点看着零散,实际都挂在同一根线上——线程在什么条件下让出执行权、以什么状态等待、被唤醒或被中断后如何回到可运行状态。课程里对中断的两种处理姿势、join 遇到中断后线程状态怎么查看,都是围绕这根线展开的,属于面试时「说出来就是加分,说不清就露怯」的内容。

内存模型:别停在背结论

JMM 是很多人复习时最容易糊弄过去的部分。原子性、可见性、有序性三个词都认识,但一问「双重检查锁为什么要加 volatile」「final 字段的写重排规则」就答不完整。这部分建议带着问题看:先自己想一遍代码在单线程下没问题、多线程下会出什么问题,再去看原理讲解,记忆会牢得多。看的时候手边开着 IDE,把示例代码敲一遍、改改参数看结果变化,比单纯看视频有效。

看完应该能回答的问题

  • 一个线程调用了 start 之后又调一次,会发生什么?为什么?
  • wait 为什么要放在循环里判断条件,而不是 if?
  • 线程中断后,什么情况下应该恢复中断标记再往外抛?
  • 怎么用 jstack 或 jconsole 判断一组线程是不是死锁,和「都在等资源」的区别在哪?
  • volatile 能保证原子性吗?为什么 i++ 加 volatile 依然不安全?

如果这几道题你能不打磕巴地讲清楚因果,而不是只给结论,这门课的主要目标就达到了。反之,把它当作一份自查清单,哪一节对不上号就重点看哪一节,不用从头平铺直叙地刷。

怎么用这份材料

建议分两轮:第一轮按顺序过,遇到讲原理的段落暂停,先自己推测结论;第二轮只挑自己答不上来的问题回看,配合代码验证。面试前一周,把上面那组问题当口试题自问自答一遍,比再刷一遍视频有用。并发这块的坑,多半不是「没学过」,而是「以为会了」——这门课的价值就在于把那些「以为会了」的地方逐个戳破。

深入浅出Java并发多线程:核心基础+内存模型+死锁——从用法到原理,面试必考

Java并发核心知识与面试技巧

编辑点评

系统讲解Java并发多线程,深入浅出,从用法到原理,覆盖常见面试问题,适合准备技术面试的开发者。

⭐ 编辑推荐

全面解析Java并发编程,从基础到面试技巧,助你轻松应对面试。

课程亮点

• Java并发核心知识讲解
• 常见面试问题解析
• 深入浅出,易于理解

课程目录

13-14 正中下怀——常见面试问题:谈谈JMM.mp4  [30.6 MB]
13-3 雷厉风行——olatile适用场合之一:纯赋值操作.mp4  [32.9 MB]
15-1 有的放矢——八大重点提炼.mp4  [67.3 MB]
14-5 冤家路窄——必然发生死锁的例子、看程序停止的信号.mp4  [55.2 MB]
5-7 官复原职——中断线程的两种姿势之恢复中断.mp4  [43.4 MB]
12-11 不见森林——为什么会有可见性问题?.mp4  [25.7 MB]
14-18 徒劳无功——什么是活锁?.mp4  [33.7 MB]
7-13 望穿秋水——join遇到中断、join期间线程状态的两种查看方式.mp4  [50.6 MB]
10-15 自损八千——双刃剑总结.mp4  [47.0 MB]
12-5 难分伯仲——JMM是什么?重排序、可见性、原子性简介.mp4  [34.4 MB]
4-4 天缘凑合——彩蛋:【Java名字由来的奇闻轶事】.mp4  [32.9 MB]
7-2 你方唱罢——wait的作用和用法.mp4  [84.3 MB]
10-6 互不相让——死锁发生.mp4  [31.1 MB]
4-3 中流砥柱——run()方法原理解读.mp4  [6.9 MB]
12-8 化零为整——重排序的好处和3种发生时机、重排序总结.mp4  [26.1 MB]
7-3 我方登场——notify与notifyAll的区别.mp4  [42.4 MB]
14-8 缺一不可——分析死锁要发生的4个必要条件,逐一对比刚才的实例.mp4  [43.3 MB]
13-9 独一无二——单例模式与JMM的联系.mp4  [41.4 MB]
10-4 不断进击——a++具体在哪里消失?又消失了几个呢?(上).mp4  [71.8 MB]
14-15 剥夺权利——检测与恢复策略.mp4  [26.8 MB]
5-15 停止线程——常见面试问题.mp4  [18.9 MB]
15-3 知己知彼——面试高频考点汇总.mp4  [57.2 MB]
10-13 面面俱到——四种需要考虑线程安全的情况.mp4  [21.0 MB]
3-7 眼前一亮——实现多线程常见面试问题.mp4  [21.5 MB]
14-12 思考人生——哲学家就餐问题描述.mp4  [23.9 MB]
8-2 对号入座——线程ID,线程的唯一身份标识.mp4  [34.2 MB]
7-7 你来我往——两个线程交替打印0_100的奇偶数.mp4  [106.7 MB]
3-2 无独有偶——同时使用两种方法;正确实现方法的总结.mp4  [36.8 MB]
14-2 切瑳琢磨——考考你.mp4  [8.5 MB]
14-17 一心一意——实际工程中避免死锁的8个tips——part 2.mp4  [30.6 MB]
12-6 眼见为实——重排序的前3种可能性.mp4  [69.3 MB]
5-11 看似可行——错误的停止线程方法之二-olatile的标记位.mp4  [66.0 MB]
13-13 一争高下——哪种实现方案最好?单例模式总结.mp4  [37.0 MB]
14-3 一图千言——什么是死锁?.mp4  [26.7 MB]
10-11 狸猫太子——用“副本”代替“真身”.mp4  [15.1 MB]
…(已达 35 条上限,后续省略)

适合人群

  • Java开发者
  • 准备技术面试者
  • 对并发编程感兴趣的程序员

学习收获

掌握Java并发编程核心原理
应对Java并发面试题
提升编程能力

祝您学习愉快!

学有所成,前程似锦!