外观
Java 有哪些并发工具类?
⭐ 题目日期:
字节 - 2024/12/25
📝 题解:
Java 提供了丰富的并发工具类,主要集中在 java.util.concurrent 包及其子包中。以下是常见的并发工具类及其分类:
1. 同步辅助类
CountDownLatch
允许线程等待一个或多个操作完成。通过计数器实现,计数器归零时等待线程恢复执行。- 一次性使用,不可重置。
CyclicBarrier
让一组线程互相等待,直到所有线程到达某个屏障点。支持重复使用。- 适用于分阶段任务,如多阶段计算。
Semaphore
控制同时访问资源的线程数量(限流)。- 支持公平/非公平模式。
Phaser(Java 7+)
更灵活的屏障,支持动态调整参与的线程数,分阶段同步。- 替代
CyclicBarrier和CountDownLatch的复杂场景。
- 替代
Exchanger
两个线程在屏障点交换数据,适用于生产者-消费者模型。
2. 线程池与执行框架
Executor框架ExecutorService:管理线程池的核心接口。ThreadPoolExecutor:可配置的线程池实现。Executors:工厂类,提供常见线程池(如newFixedThreadPool、newCachedThreadPool)。ScheduledExecutorService:支持定时/周期性任务。
Fork/Join框架(Java 7+)ForkJoinPool:分治任务线程池,适用于递归分解任务(如并行计算)。RecursiveTask:带返回值的任务。RecursiveAction:无返回值的任务。
3. 锁与原子操作
ReentrantLock
可重入锁,替代synchronized,支持公平锁、可中断锁等待。ReadWriteLock
读写分离锁,通过ReentrantReadWriteLock实现,读操作不互斥,提升读多写少场景的性能。StampedLock(Java 8+)
支持乐观读、悲观读和写锁,适用于读多写少且竞争不激烈的场景。原子类(
java.util.concurrent.atomic)AtomicInteger、AtomicLong:原子更新基本类型。AtomicReference:原子更新对象引用。LongAdder(Java 8+):高并发下性能优于AtomicLong。
4. 并发集合
ConcurrentHashMap
线程安全的哈希表,分段锁(Java 7)或 CAS + synchronized(Java 8+)实现。CopyOnWriteArrayList/CopyOnWriteArraySet
写时复制的集合,读操作无锁,适合读多写少场景。阻塞队列(
BlockingQueue)ArrayBlockingQueue:基于数组的有界队列。LinkedBlockingQueue:基于链表的可选有界队列。PriorityBlockingQueue:支持优先级的无界队列。SynchronousQueue:直接传递任务的队列(无缓冲)。
5. 异步与 Future
Future和Callable
表示异步任务的结果,通过ExecutorService.submit()提交任务。CompletableFuture(Java 8+)
支持链式异步编程,可组合多个异步任务(如thenApply、thenCombine)。CompletionService
解耦任务提交与结果获取,按完成顺序处理结果。
6. 其他工具
ThreadLocalRandom(Java 7+)
多线程下高效的随机数生成器。LockSupport
底层线程阻塞/唤醒工具(如park()和unpark()),用于构建高级锁。
总结
- 同步协作:
CountDownLatch、CyclicBarrier、Phaser。 - 资源控制:
Semaphore、ReentrantLock。 - 线程池:
ExecutorService、ForkJoinPool。 - 无锁编程:原子类、
StampedLock。 - 异步处理:
CompletableFuture、Future。 - 并发数据结构:
ConcurrentHashMap、BlockingQueue。
根据具体场景选择合适的工具,例如高并发读操作可用 StampedLock,任务分阶段协调用 Phaser,异步任务编排用 CompletableFuture。注意线程安全和避免死锁。
