外观
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
。注意线程安全和避免死锁。