介绍下JUC,都有哪些工具类?¶
典型回答¶
Java 的 JUC(java.util.concurrent)是 Java 并发编程的核心工具包,几乎所有高性能、多线程的 Java 应用都会用到它。从 JDK 1.5 开始引入,由 Doug Lea 主导开发。
在 JUC 出现之前,Java 开发者主要依赖 **synchronized** 和 **Object** 的 **wait()/notify()** 等方式进行线程之间的同步(保证并发安全)。但是有很多缺点:
- 粒度粗:
**synchronized**锁住的是整个对象或类,容易导致不必要的线程阻塞,降低并发性能。 - 功能有限: 难以实现复杂的同步需求,如读写锁、信号量、屏障等。
- 易出错: 手动管理
**wait()**和**notify()**容易导致死锁等问题,代码难以编写和维护。 - 性能瓶颈:
**synchronized**是重量级锁,他的性能可能成为瓶颈。
于是就出现了JUC,说白了就是提供了很多并发安全的工具类,帮助开发者来在并发场景下使用。JUC中的工具类会通过细粒度锁、CAS、并发数据结构等大幅提升高并发场景下的吞吐量和响应速度。
JUC中主要包含以下工具类:
线程池与任务执行框架¶
这部分是 JUC 中最常用的一部分,统一了线程的创建、调度和销毁。
- 核心接口
Executor:执行任务的最顶层接口(任务用Runnable表示)。ExecutorService:扩展了Executor,提供了生命周期管理(shutdown)和任务提交(submit)等方法。ScheduledExecutorService:支持延时与周期性任务调度。
- 主要实现类
ThreadPoolExecutor:可配置的线程池,支持核心线程数、最大线程数、队列、拒绝策略等。ScheduledThreadPoolExecutor:定时任务线程池。- 工具类
Executors:提供常用线程池工厂方法(但生产环境推荐自己用ThreadPoolExecutor构造,避免资源问题)。 ForkJoinPool/ForkJoinTask:分而治之的并行计算框架,支持工作窃取算法(parallelStream()底层就是它)。
- 新特性
- JDK 8 引入
CompletableFuture:支持链式异步编程。 - JDK 21 可结合虚拟线程
Executors.newVirtualThreadPerTaskExecutor()。
- JDK 8 引入
同步器¶
这些是比 synchronized 更灵活、更高性能的线程协作工具。他们是AQS的具体实现。
- 锁
ReentrantLock:可重入互斥锁,支持公平/非公平模式,支持条件变量Condition。ReentrantReadWriteLock:读写分离锁,读锁共享、写锁独占。StampedLock:支持乐观读,性能更高(但 API 相对复杂)。
- 并发控制工具
Semaphore:计数信号量,限制同时访问资源的线程数。CountDownLatch:倒计时锁存器,等待一组操作完成再继续。CyclicBarrier:循环屏障,一组线程到达屏障点后一起继续。Phaser:更灵活的阶段同步器(CyclicBarrier+CountDownLatch的超集)。
- 底层支持类
AbstractQueuedSynchronizer(AQS):几乎所有 JUC 锁和同步器的基础框架,基于 FIFO 队列和 CAS 实现。
并发集合¶
这些集合在多线程环境下是线程安全的,性能远高于 Collections.synchronizedXXX。
- 常用容器
ConcurrentHashMap:高性能并发哈希表(JDK 8 以后用 CAS + 分段桶链表/红黑树)。ConcurrentLinkedQueue/ConcurrentLinkedDeque:无界非阻塞链表队列。CopyOnWriteArrayList/CopyOnWriteArraySet:写时复制,适合读多写少场景。
- 阻塞队列
ArrayBlockingQueue:有界阻塞队列(基于数组)。LinkedBlockingQueue:有界/无界链表阻塞队列。PriorityBlockingQueue:支持优先级的阻塞队列。DelayQueue:延时队列,任务到期后才能取出。SynchronousQueue:无缓冲队列,交替交付任务(常用于直接交接任务给线程池)。LinkedTransferQueue:高性能转移队列,支持直接传递元素。
原子变量¶
提供无锁线程安全的原子操作,基于 CPU 的 CAS 指令。
- 原子类
- 基本类型:
AtomicInteger、AtomicLong、AtomicBoolean。 - 数组类型:
AtomicIntegerArray、AtomicLongArray。 - 引用类型:
AtomicReference、AtomicStampedReference(解决 ABA 问题)。 - 字段更新器:
AtomicIntegerFieldUpdater等(基于反射直接更新对象字段)。
- 基本类型: