Java中的并发与多线程:从基础到进阶技术
现代应用程序需要最大性能。在Java中,并发和多线程是有效利用多核处理器的关键工具。本文将讲解如何正确处理线程、同步以及现代并发工具。
Java中的多线程是什么?
多线程是程序同时执行多个任务的能力。在Java中,每个线程(thread)都是一个轻量级进程,拥有自己的调用栈。主要优势:
- 通过并行执行提升性能
- 更响应的用户界面
- 有效利用CPU资源
创建线程:两种方法
Java中有两种主要创建线程的方式:
1. 继承Thread类
public class MyThread extends Thread { @Override public void run() { System.out.println("线程正在执行: " + Thread.currentThread().getName()); }
public static void main(String[] args) { MyThread thread = new MyThread(); thread.start(); // 启动线程 }}2. 实现Runnable接口
public class Task implements Runnable { @Override public void run() { System.out.println("任务在线程中执行: " + Thread.currentThread().getName()); }
public static void main(String[] args) { Thread thread = new Thread(new Task()); thread.start(); }}推荐使用Runnable,因为它不会限制继承其他类的可能性。
线程同步:避免竞态条件
当多个线程访问共享数据时,会出现同步问题。来看一个经典示例——计数器:
public class Counter { private int count = 0;
public synchronized void increment() { count++; }
public synchronized int getCount() { return count; }}关键字synchronized确保同一时间只有一个线程可以执行该方法。替代方案是使用java.util.concurrent.locks包中的Lock。
死锁:如何避免互相阻塞
当两个线程互相等待对方释放资源时,就会发生死锁。示例:
public class DeadlockExample { private final Object lock1 = new Object(); private final Object lock2 = new Object();
public void method1() { synchronized (lock1) { synchronized (lock2) { // 临界区 } } }
public void method2() { synchronized (lock2) { synchronized (lock1) { // 临界区 } } }}为避免死锁,始终以相同顺序获取锁,或使用带超时的tryLock()。
ExecutorService:管理线程池
手动创建线程效率低下。Java提供了ExecutorService来管理线程池:
import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;
public class ThreadPoolExample { public static void main(String[] args) { ExecutorService executor = Executors.newFixedThreadPool(4);
for (int i = 0; i < 10; i++) { executor.submit(() -> { System.out.println("正在执行于: " + Thread.currentThread().getName()); }); }
executor.shutdown(); // 所有任务完成后终止 }}主要线