Java JUC (Java Util Concurrent) 是 Java 提供的一套高性能并发编程工具包,位于 java.util.concurrent 包及其子包中(如 atomic、locks)。它提供了比传统同步机制(如 synchronized)更灵活、更高效的线程控制工具,专门用于简化多线程开发并提升高并发场景下的性能。
JUC 的核心组件
-
原子类(
java.util.concurrent.atomic)-
原理:基于 CAS(Compare-And-Swap) 无锁算法实现,保证操作的原子性。
-
示例:
AtomicInteger:原子更新整型AtomicReference:原子更新对象引用LongAdder:高性能累加器(适合高并发统计)
AtomicInteger counter = new AtomicInteger(0); counter.incrementAndGet(); // 线程安全的自增 -
-
锁机制(
java.util.concurrent.locks)- ReentrantLock:可重入锁,替代
synchronized,支持公平锁/非公平锁。 - StampedLock:乐观读锁,在读多写少场景性能更高。
- ReadWriteLock:读写分离锁(
ReentrantReadWriteLock),提升读操作的并发性。
ReentrantLock lock = new ReentrantLock(); lock.lock(); try { // 临界区代码 } finally { lock.unlock(); } - ReentrantLock:可重入锁,替代
-
并发集合类
- ConcurrentHashMap :高并发线程安全的 HashMap。
- CopyOnWriteArrayList:读操作无锁,写操作复制新数组(适合读多写少)。
- 阻塞队列(
BlockingQueue):ArrayBlockingQueue:有界数组队列LinkedBlockingQueue:无界链表队列SynchronousQueue:直接传递任务的队列
- 线程协作工具(Synchronizers)
- CountDownLatch:等待多个线程完成后再继续。
CountDownLatch latch = new CountDownLatch(3);
// 线程调用 latch.countDown() 减少计数
latch.await(); // 阻塞直到计数为0
- CyclicBarrier:线程到达屏障点后集体等待。
- Semaphore:控制同时访问资源的线程数(限流)。
- Phaser:分阶段的多线程任务协同(比
CyclicBarrier更灵活)
- 线程池框架(
ExecutorService)
- 核心类:
ThreadPoolExecutor、ScheduledThreadPoolExecutor - 工具类:
Executors(提供快捷创建线程池的方法,但需注意规避资源耗尽风险)。
ExecutorService pool = Executors.newFixedThreadPool(4);
pool.submit(() -> System.out.println("Task running"));
pool.shutdown();
6.Future 与异步结果
Future:获取异步任务结果。CompletableFuture(Java 8+):支持链式异步编程、组合任务。
为什么需要 JUC?
- 性能更高:CAS 无锁操作避免线程阻塞(如
AtomicXXX替代synchronized)。 - 灵活性更强:支持超时锁、中断响应锁(
lock.tryLock(1, TimeUnit.SECONDS))。 - 功能更丰富:提供阻塞队列、线程协作工具等高级特性。
- 减少死锁风险:通过显式锁(
Lock)替代隐式锁(synchronized)。
典型应用场景
- 高并发计数器 →
AtomicLong/LongAdder - 缓存 →
ConcurrentHashMap - 任务调度 →
ScheduledThreadPoolExecutor - 生产者-消费者模型 →
BlockingQueue - 批量任务并行执行 →
CountDownLatch+ExecutorService
JUC 对比传统同步
| 特性 | synchronized | JUC(如 ReentrantLock) |
|---|---|---|
| 锁获取方式 | 隐式(JVM 控制) | 显式(代码控制) |
| 响应中断 | ❌ | ✅(lockInterruptibly()) |
| 公平锁 | ❌ | ✅ |
| 超时获取锁 | ❌ | ✅(tryLock(timeout)) |
| 绑定多个条件变量 | ❌(只能绑定一个 wait()) | ✅(多个 Condition) |
总结
Java JUC 是构建高并发、高性能、线程安全应用的核心工具库。它通过 CAS、显式锁、并发容器、线程池等机制,解决了传统同步的性能瓶颈和功能局限,是 Java 并发编程的工业级标准。深入理解 JUC 对优化分布式系统、消息中间件等场景至关重要。