主题
面试速答(先看这里)
**一句话结论:**Java 的 JUC( java.util.concurrent )是 Java 并发编程的核心工具包,几乎所有高性能、多线程的 Java 应用都会用到它。
60秒标准回答:
Java 的 JUC( java.util.concurrent )是 Java 并发编程的核心工具包,几乎所有高性能、多线程的 Java 应用都会用到它。从 JDK 1.5 开始引入,由 Doug Lea 主导开发
在 JUC 出现之前,Java 开发者主要依赖 synchronized 和 Object 的 wait()/notify() 等方式进行线程之间的同步(保证并发安全)。但是有很多缺点
于是就出现了JUC,说白了就是提供了很多并发安全的工具类,帮助开发者来在并发场景下使用。 JUC中的工具类会 通过细粒度锁、CAS、并发数据结构等大幅提升高并发场景下的吞吐量和响应速度
**答题顺序:**结论 → 原理/机制 → 关键流程 → 场景与取舍 → 易错点
回答主线:
- **要点1:**在 JUC 出现之前,Java 开发者主要依赖 synchronized 和 Object 的 wait()/notify() 等方式进行线程之间的同步(保证并发安全)。
- **要点2:**于是就出现了JUC,说白了就是提供了很多并发安全的工具类,帮助开发者来在并发场景下使用。
- **要点3:**这部分是 JUC 中最常用的一部分,统一了线程的创建、调度和销毁。
- **要点4:**这些是比 synchronized 更灵活、更高性能的线程协作工具。
- **要点5:**这些集合在多线程环境下是线程安全的,性能远高于 Collections.synchronizedXXX 。
**记忆锚点:**JUC → synchronized → Java → JDK → CAS → 线程池与任务执行框架
关键取舍:
- Java 的 JUC( java.util.concurrent )是 Java 并发编程的核心工具包,几乎所有高性能、多线程的 Java 应用都会用到它。
- 但是有很多缺点: 粒度粗: synchronized 锁住的是整个对象或类,容易导致不必要的线程阻塞,降低并发性能。
- 性能瓶颈: synchronized 是重量级锁,他的性能可能成为瓶颈。
易错提醒:
- 但是有很多缺点: 粒度粗: synchronized 锁住的是整个对象或类,容易导致不必要的线程阻塞,降低并发性能。
- 易出错: 手动管理 wait() 和 notify() 容易导致死锁等问题,代码难以编写和维护。
加分表达:
- 于是就出现了JUC,说白了就是提供了很多并发安全的工具类,帮助开发者来在并发场景下使用。
- JUC中的工具类会 通过细粒度锁、CAS、并发数据结构等大幅提升高并发场景下的吞吐量和响应速度。
追问准备:
- 围绕「JUC」:底层原理是什么?使用时有哪些边界和常见坑?
- 围绕「synchronized」:底层原理是什么?使用时有哪些边界和常见坑?
- 围绕「Java」:底层原理是什么?使用时有哪些边界和常见坑?
- 如果线上出现异常,你会如何定位、验证并规避?
典型回答
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()。
同步器
这些是比 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等(基于反射直接更新对象字段)。