Java 多线程基础入门教程:从小白到掌握核心概念
在现代 Java 开发中,多线程编程早已成为一项必备技能。随着多核处理器的普及和高并发需求的增加,掌握多线程的知识不仅能提升程序性能,也能让你在面试中脱颖而出。今天这篇文章,我们就从零开始,一步步带你掌握 Java 多线程的核心基础。
一、什么是线程?为什么要用多线程?
线程是操作系统调度的最小单位。简单来说,一个线程就是一个“执行流”,它可以和其他线程同时执行不同的任务。
打个比方,如果一个公司去银行办理多个业务,单靠一个人(主线程)效率低下,不如多个员工同时处理各自的事务,这就像我们用多个线程来并发处理不同任务,提高程序效率。
多线程的优势主要有:
-
更好地利用多核 CPU 的资源
-
提升 IO 密集型程序的响应能力
-
相比多进程更加轻量和高效
二、Java 中创建线程的几种方式
Java 中创建线程主要有以下几种方式:
1. 继承 Thread
类
class MyThread extends Thread {
public void run() {
System.out.println("线程运行中...");
}
}
new MyThread().start();
2. 实现 Runnable
接口
class MyRunnable implements Runnable {
public void run() {
System.out.println("线程运行中...");
}
}
new Thread(new MyRunnable()).start();
3. 使用 Lambda 表达式(JDK8+)
new Thread(() -> System.out.println("Lambda 线程")).start();
推荐方式:实现 Runnable 更符合面向对象的设计,避免了单继承的限制。
三、常用线程操作方法
-
start()
:启动线程 -
join()
:等待线程执行完成 -
interrupt()
:中断线程 -
isAlive()
:判断线程是否仍在运行 -
sleep(ms)
:线程休眠
四、线程的生命周期
Java 线程的状态一共有 6 种:
-
NEW
:新建 -
RUNNABLE
:可运行 -
BLOCKED
:被阻塞 -
WAITING
:等待 -
TIMED_WAITING
:限时等待 -
TERMINATED
:已终止
五、线程安全问题与解决方案
问题:线程不安全
当多个线程同时修改共享变量时,就会出现竞态条件。例如:
class Counter {
int count = 0;
void increase() {
count++;
}
}
上述代码在并发场景下无法保证 count
的准确性。
解决方案一:使用 synchronized
synchronized void increase() {
count++;
}
synchronized
能保证:
-
互斥性(同一时刻只有一个线程能执行该代码块)
-
可见性(刷新内存中的变量值)
-
可重入性(不会锁死自己)
解决方案二:使用 volatile
volatile
可以保证线程之间变量的可见性,但不能保证原子性。例如:
volatile int flag = 0;
两者区别:
-
synchronized
:保证原子性+可见性 -
volatile
:只保证可见性
六、线程通信:wait
、notify
、notifyAll
Java 提供了线程间通信机制,用于协调多个线程之间的执行顺序:
-
wait()
:让线程等待 -
notify()
:唤醒一个等待的线程 -
notifyAll()
:唤醒所有等待的线程
这组方法必须和 synchronized
一起使用。
七、实用多线程案例
1. 单例模式(懒汉模式 + 双重校验)
class Singleton {
private static volatile Singleton instance;
private Singleton() {}
public static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null)
instance = new Singleton();
}
}
return instance;
}
}
2. 阻塞队列实现生产者消费者模型
使用 LinkedBlockingQueue
来解耦生产者和消费者之间的逻辑,非常适合高并发场景。
总结
Java 多线程虽不易,但掌握核心概念之后,其实也没那么难。本文我们从线程的基本概念出发,介绍了线程创建、常见操作、线程状态、线程安全问题及解决方案,并辅以实际案例,帮助你全面入门 Java 多线程编程。
希望这篇文章能成为你学习并发编程的起点。后续我们还会继续深入线程池、并发集合、CAS 原理等更高级的话题,敬请期待!
博客更新中: 多线程实战篇即将上线!