java 如何处理并发
Java 并发处理的核心机制
Java 提供了多种机制来处理并发编程,确保线程安全和高效执行。以下是主要方法:
线程同步与锁机制
synchronized 关键字用于方法或代码块,确保同一时间只有一个线程访问共享资源。ReentrantLock 提供更灵活的锁控制,支持公平锁和尝试锁。
并发集合类
ConcurrentHashMap、CopyOnWriteArrayList 等线程安全的集合类,通过分段锁或写时复制技术实现高效并发访问。
原子变量
AtomicInteger、AtomicReference 等原子类利用 CAS(Compare-And-Swap)操作实现无锁线程安全。
高级并发工具
Executor 框架
通过 ExecutorService 和线程池(如 ThreadPoolExecutor)管理线程生命周期,避免频繁创建销毁线程的开销。
Future 与 CompletableFuture
Future 获取异步任务结果,CompletableFuture 支持链式异步编程和组合多个异步操作。
CountDownLatch/CyclicBarrier
CountDownLatch 让线程等待其他线程完成操作,CyclicBarrier 使一组线程互相等待到达屏障点。
并发设计模式
不可变对象
创建后状态不可修改的对象天然线程安全,如 String 和 BigInteger。
线程局部变量
ThreadLocal 为每个线程维护独立的变量副本,避免共享资源竞争。
生产者-消费者模式
通过阻塞队列(如 LinkedBlockingQueue)实现线程间高效数据传输。
代码示例:线程安全计数器
// 使用 AtomicInteger 实现无锁计数器
AtomicInteger counter = new AtomicInteger(0);
counter.incrementAndGet(); // 线程安全的递增
// 使用 synchronized 实现同步块
private final Object lock = new Object();
private int count = 0;
public void increment() {
synchronized(lock) {
count++;
}
}
性能优化与注意事项
减少锁粒度
尽量缩小同步代码块范围,例如使用 ConcurrentHashMap 的分段锁替代全局锁。
避免死锁
按固定顺序获取多个锁,或使用 tryLock() 设置超时时间。
线程池调优 根据任务类型(CPU密集型/IO密集型)合理设置线程池大小,通常 CPU 密集型任务线程数设置为 CPU 核心数。
内存可见性
使用 volatile 关键字或原子类保证变量修改对其他线程立即可见。
Java 并发编程需要根据具体场景选择合适工具,平衡线程安全与性能。JDK 8 引入的并行流(parallelStream)和新的并发类(如 StampedLock)进一步简化了并发处理。







