692 words
3 minutes
Java SE 系列(七):多线程核心

AI 智能总结

Java SE 7 多线程核心#

多线程是 Java 并发编程基础,本文精简梳理线程创建、synchronized 锁、volatile、线程状态、等待唤醒机制,搭配简洁代码,直击面试与开发核心。

一、线程的三种创建方式#

继承 Thread 类:重写 run 方法,无法再继承其他类
实现 Runnable 接口:无返回值,推荐使用,避免单继承限制
Callable+FutureTask:支持返回值、抛出异常

// 常用:Runnable方式创建线程
public class ThreadDemo {
public static void main(String[] args) {
new Thread(() -> {
System.out.println("线程执行:" + Thread.currentThread().getName());
}).start();
}
}

注意:run() 只是普通方法调用,必须调用 start () 才会开启新线程。

二、synchronized 同步锁#

解决多线程共享数据并发安全问题,保证原子性、可见性、有序性。 可修饰方法、代码块,保证同一时间只有一个线程执行临界区代码。

// 线程安全计数
static int count = 0;
public static synchronized void add(){
count++;
}

三、volatile 轻量级关键字#

保证可见性、有序性,不保证原子性
禁止指令重排,实时刷新主存数据,线程间数据实时可见
适用于状态标记量场景,不能替代锁解决复合操作并发问题

// 正确用法:状态标记量,线程间可见
public class VolatileDemo {
// 停止标记,volatile保证实时可见
private volatile boolean stopped = false;
public void stop() {
stopped = true; // 主线程修改,工作线程实时可见
}
public void run() {
while (!stopped) { // 循环检测停止标记
// 执行业务...
}
}
// 错误用法:volatile无法保证原子性
private volatile static int count = 0;
// 复合操作:读取→修改→写入,仍会出现并发问题
public static void increment() {
count++; // 此处仍需要synchronized保证安全
}
}

四、线程五大状态#

新建:new Thread 后未启动
就绪:调用 start (),等待 CPU 调度
运行:获取 CPU 时间片,执行 run 方法
阻塞:锁阻塞、等待阻塞、超时阻塞,主动让出 CPU
终止:任务执行完毕 / 异常结束,线程销毁

五、等待唤醒机制#

基于 wait()、notify()、notifyAll(),属于 Object 方法,需在同步代码块中执行。 wait():当前线程释放锁,进入等待池
notify():随机唤醒一个等待线程
notifyAll():唤醒全部等待线程

// 等待唤醒简单示例
synchronized (obj) {
try {
obj.wait(); // 线程等待
} catch (InterruptedException e) {
e.printStackTrace();
}
obj.notify(); // 唤醒等待线程
}

核心要点#

开发优先使用Runnable创建线程,解耦且灵活。
复合计数、共享变量修改用 synchronized 保证线程安全。
volatile 仅做状态标识,不支持自增等非原子操作。
等待唤醒必须配合锁使用,是线程间通信的基础方案。

Java SE 系列(七):多线程核心
https://fuwari.vercel.app/posts/java-se-series/java-se-07-thread/
Author
Zero02
Published at
2025-02-16
License
CC BY-NC-SA 4.0