Photo by Lorem Ipsum
692 words
3 minutes
Java SE 系列(七):多线程核心
Java SE 教程
Posts in this series (10)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/