能力缺口:为什么你写的并发代码总出问题

Java 并发是转岗面试和实际开发里的重灾区。很多人的缺口不在于不知道 Thread 这个词,而在于概念是散的:会写 new Thread().start(),但说不清线程的几个状态怎么流转;知道加 synchronized,但遇到生产者消费者模型就卡壳;写出来的多线程程序偶尔报错,却不知道是线程不安全还是调度顺序乱了。这门课针对的就是这种“半懂不懂”的状态,它没有去扯 JUC 高级包或线程池源码,而是死磕 Java 并发最底层的地基。如果你的基础是能看懂基本语法、能写出面向对象的接口与继承,但一遇到并发就发虚,这门课正好补这块短板。别假装什么都会,如果连 Runnable 和 Thread 的区别都讲不利索,建议直接从这里开始。

补漏顺序:从创建到通信的闭环练习

看这份资料不要跳着看,它的逻辑链条扣得很紧。建议先看前三块,把继承 Thread 类和实现 Runnable 接口两种创建方式彻底吃透,重点对比它们在单继承局限上的差异,这是面试必问点。接着是生命周期和优先级部分,这部分别只背概念,要在练习里打断点去观察线程的状态切换,搞懂 sleep、join、yield 这些方法到底改变了什么状态。后面大头的练习要放在线程安全问题上,这是这门课的核心。资料里给了三个小节讲安全问题,你要配合着写代码:先写一个多线程同时操作共享变量的例子,跑出数据错乱的现象,再自己用同步代码块和同步方法去修复它。最后看线程间通信和生产者消费者模型,这块建议自己画一张状态交互图,把 wait 和 notify 的调用时机标清楚,配合资料里的单例模式练习,手写一个线程安全的单例出来。

看完应能回答什么与资料怎么用

学完不能只会背名词,得能独立解决具体问题。你应该能独立回答这些问题:实现 Runnable 相比继承 Thread 到底好在哪?线程进入阻塞状态有哪几种途径?为什么同步代码块要用特定的锁对象?生产者和消费者是如何通过 wait/notify 解耦的?在实际干活时,你应该能独立写出一个线程安全的售票或者取钱程序,能定位出某段并发代码为什么会丢数据,并且能自己改对。资料包里的视频线索主要用来理解机制,别光看,看完一节必须自己在编辑器里敲一遍。尤其是安全问题那几节,先把老师演示的错误代码复现出来,看着它报错,再自己动手加锁修复。这种“先制造问题再解决问题”的练法,比直接抄写正确代码有效得多,缺什么补什么,动手跑过才算真补上。

课程目录

1 线程简介 (16:02)
2 创建线程-继承Thread类 (28:26)
3 创建线程-实现Runnable接口 (08:39)
4 两种方式的对比 (15:46)
5 线程的生命周期 (17:58)
6 线程优先级 (07:40)
7 生命周期的相关方法 (24:05)
8 线程安全问题_1 (29:14)
9 线程安全问题_2 (11:29)
10 线程安全问题_3 (05:32)
11 线程间的通信 (34:39)
12 生产者和消费者_1 (10:22)
13 生产者和消费者_2 (26:12)
14 线程单例 (17:25)