# 多线程:Java工程师的必经关卡,这篇带你打通任督二脉

在Java程序员的面试中,“多线程”往往是区分初级与高级的分水岭。它不仅是高频考点,更是实际开发中保障系统高性能的核心基石。本次《Java程序员面试宝典》第十一部分,将带你系统梳理多线程的关键知识点,从基础概念到高阶实战,层层递进,助你从容应对面试官的深度追问。

一、 回归本源:厘清核心概念

课程开篇即直击根本:**程序、进程与线程的区别是什么?**很多开发者能背诵定义,却难以在实际场景中清晰阐述。我们将深入剖析三者关系——程序是代码集合,进程是资源分配的基本单位,而线程是CPU调度的基本单位。理解这一点,是后续所有并发编程学习的逻辑起点。

紧接着,我们探讨**线程的创建方式**。除了熟悉的继承`Thread`类和实现`Runnable`接口,你是否知道`Callable`与`FutureTask`的存在?更重要的是,面试官常问:“Thread类是否实现了Runnable接口?”这是一个细节陷阱,答案是否定的,Thread本身继承自Object并实现了Runnable,这一层级关系必须明确。此外,课程还通过编程题形式,让你亲手用两种匿名内部类方式创建线程,巩固实践技能。

二、 生命周期与状态流转

线程并非从创建到运行只有“开始”和“结束”两个状态。课程详细讲解**线程的五种状态**:新建(New)、就绪(Runnable)、运行(Running)、阻塞(Blocked)和终止(Terminated)。重点辨析`start()`方法调用后,线程并非立即进入运行状态,而是先入就绪队列,等待CPU调度。

同时,我们对比`sleep()`、`yield()`和`join()`三个易混淆方法:
- `sleep()`会暂停当前线程,但不释放锁;
- `yield()`仅让出CPU资源,回到就绪状态竞争;
- `join()`则用于等待指定线程结束,实现线程间的协同。

三、 同步机制与死锁防范

**synchronized**是Java中最常用的同步关键字。课程明确其作用范围:修饰方法时,锁住的是整个对象实例;修饰代码块时,可精确指定锁对象,避免过度锁定。对于废弃的`stop()`和`destroy()`方法,我们将解释为何它们会导致线程安全问题而不再推荐使用。

**死锁**是并发编程的噩梦。课程通过经典场景分析死锁产生的四个必要条件,并提供预防策略——如破坏请求保持条件、有序资源分配等。如何通过算法确保N个线程访问N个资源而不死锁?这是考察系统设计能力的经典问题。

四、 通信机制与单例模式实战

`wait()`、`notify()`和`notifyAll()`是线程间通信的核心API。关键点在于:调用`wait()`时,线程**会释放持有的锁**,这是与`sleep()`的本质区别。此外,`notify()`唤醒的是在该对象等待池中的任意一个线程,而非“第一个”,这一细节常被误解。

最后,课程聚焦于**单例模式的多线程安全实现**。从饿汉式(类加载即初始化,天然线程安全)到懒汉式(需加`synchronized`或双重检查锁定),再到第三种结合`volatile`与CAS的优化方案,每一种写法都对应着不同的性能权衡与适用场景。配合编程题练习,你将掌握在不同业务背景下选择最优单例实现的能力。

通过本章节的系统学习,你不仅能应对面试中的理论追问,更能建立起编写高并发、低bug代码的工程思维。多线程的世界复杂而精妙,愿这份导读成为你探索之旅的可靠地图。

课程目录

1 程序、进程、线程的区别是什么? (04:26).mp4
 2 【编程题】请写下创建多线程的方式? (03:34).mp4
 3 Thread 类有没有实现 Runnable 接口? (01:15).mp4
 4 当调用一个线程对象的 start 方法后,线程马上进入运行状 (02:01).mp4
 5 为什么不推荐使用 stop 和 destroy (01:05).mp4
 6 sleep、yield、join 方法的区别? (09:36).mp4
 7 synchronize 修饰在方法是什么意思? (02:41).mp4
 8 synchronize修饰的语句块,是表示该代码块运行时必须 (06:00).mp4
 9 死锁是怎么造成的 (08:06).mp4
 

10 【编程题】使用 Timer 和 TimerTask 实现定时 (11:36).mp4
 

11 wait 方法被调用时,所在线程是否会释放所持有的锁资源?s (04:37).mp4
 12 wait、notify、notifyAll是在Object类 (13:07).mp4
 

13 notify 是唤醒所在对象 wait 中的第一个线程吗? (49).mp4
 14 如何确保N个线程可以访问N个资源同时又不导致死锁? (07:35).mp4
 

15 【编程题】请写出单例模式之饿汉式与描述特点 (03:52).mp4
 

16 【编程题】请写出单例模式之懒汉式与描述特点 (04:58).mp4
 

17 【编程题】请写出单例模式第三种格式 (02:08).mp4
 

18 多线程(线程的五种状态) (08:30).mp4
 

19 【编程题】使用二种匿名内部类方法来完成线程 (03:35).mp4