java如何处理并发
并发处理的基本概念
Java通过多线程机制实现并发处理,允许程序同时执行多个任务。关键在于线程安全、同步机制以及高效资源管理。
线程创建与管理
继承Thread类
自定义类继承Thread并重写run()方法,通过调用start()启动线程。
class MyThread extends Thread {
public void run() {
System.out.println("Thread running");
}
}
MyThread t = new MyThread();
t.start();
实现Runnable接口
更灵活的方式是实现Runnable接口,避免单继承限制。
class MyRunnable implements Runnable {
public void run() {
System.out.println("Runnable running");
}
}
Thread t = new Thread(new MyRunnable());
t.start();
同步机制
synchronized关键字
通过同步方法或代码块确保线程安全,防止数据竞争。
public synchronized void safeMethod() {
// 线程安全代码
}
ReentrantLock类
提供更灵活的锁控制,支持公平锁和条件变量。
ReentrantLock lock = new ReentrantLock();
lock.lock();
try {
// 临界区代码
} finally {
lock.unlock();
}
线程池优化
使用ExecutorService管理线程生命周期,避免频繁创建销毁线程的开销。
ExecutorService executor = Executors.newFixedThreadPool(4);
executor.submit(() -> {
System.out.println("Task executed by thread pool");
});
executor.shutdown();
并发工具类
CountDownLatch
等待多个线程完成后再继续主线程。
CountDownLatch latch = new CountDownLatch(3);
latch.await(); // 阻塞直到计数归零
CyclicBarrier
让一组线程相互等待到达屏障点。
CyclicBarrier barrier = new CyclicBarrier(3, () -> {
System.out.println("All threads reached barrier");
});
barrier.await();
原子操作
java.util.concurrent.atomic包提供原子变量类(如AtomicInteger),无需锁即可保证操作原子性。
AtomicInteger counter = new AtomicInteger(0);
counter.incrementAndGet();
避免死锁
- 按固定顺序获取多把锁。
- 使用
tryLock()设置超时时间。 - 通过工具(如jstack)检测死锁。
异步编程
CompletableFuture
简化异步任务编排,支持链式调用和组合操作。
CompletableFuture.supplyAsync(() -> "Hello")
.thenApplyAsync(s -> s + " World")
.thenAccept(System.out::println);
性能监控与调优
- 使用
ThreadMXBean监控线程状态。 - 通过JVM参数调整栈大小(
-Xss)或线程池配置。 - 避免过度同步导致的性能瓶颈。







