什么是 Java JUC

401 阅读2分钟

Java JUC (Java Util Concurrent)  是 Java 提供的一套高性能并发编程工具包,位于 java.util.concurrent 包及其子包中(如 atomiclocks)。它提供了比传统同步机制(如 synchronized)更灵活、更高效的线程控制工具,专门用于简化多线程开发并提升高并发场景下的性能。


JUC 的核心组件

  1. 原子类(java.util.concurrent.atomic)​

    • 原理:基于 ​CAS(Compare-And-Swap)​ 无锁算法实现,保证操作的原子性。

    • 示例:

      • AtomicInteger:原子更新整型
      • AtomicReference:原子更新对象引用
      • LongAdder:高性能累加器(适合高并发统计)
    AtomicInteger counter = new AtomicInteger(0);
    counter.incrementAndGet(); // 线程安全的自增
    
  2. 锁机制(java.util.concurrent.locks)​

    • ReentrantLock:可重入锁,替代 synchronized,支持公平锁/非公平锁。
    • StampedLock:乐观读锁,在读多写少场景性能更高。
    • ReadWriteLock:读写分离锁(ReentrantReadWriteLock),提升读操作的并发性。
    ReentrantLock lock = new ReentrantLock();
    lock.lock();
    try {
        // 临界区代码
    } finally {
        lock.unlock();
    }
    
  3. 并发集合类

  • ConcurrentHashMap :高并发线程安全的 HashMap。
  • CopyOnWriteArrayList​:读操作无锁,写操作复制新数组(适合读多写少)。
  • 阻塞队列(BlockingQueue)​​:
    • ArrayBlockingQueue:有界数组队列
    • LinkedBlockingQueue:无界链表队列
    • SynchronousQueue:直接传递任务的队列
  1. 线程协作工具(Synchronizers)
  • CountDownLatch​:等待多个线程完成后再继续。
CountDownLatch latch = new CountDownLatch(3);
// 线程调用 latch.countDown() 减少计数
latch.await(); // 阻塞直到计数为0
  • CyclicBarrier​:线程到达屏障点后集体等待。
  • Semaphore​:控制同时访问资源的线程数(限流)。
  • Phaser​:分阶段的多线程任务协同(比 CyclicBarrier 更灵活)
  1. 线程池框架(ExecutorService)
  • 核心类:ThreadPoolExecutorScheduledThreadPoolExecutor
  • 工具类: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)。

典型应用场景

  1. 高并发计数器 → AtomicLong / LongAdder
  2. 缓存 → ConcurrentHashMap
  3. 任务调度 → ScheduledThreadPoolExecutor
  4. 生产者-消费者模型 → BlockingQueue
  5. 批量任务并行执行 → CountDownLatch + ExecutorService

JUC 对比传统同步

特性synchronizedJUC(如 ReentrantLock)
锁获取方式隐式(JVM 控制)显式(代码控制)
响应中断✅(lockInterruptibly()
公平锁
超时获取锁✅(tryLock(timeout)
绑定多个条件变量❌(只能绑定一个 wait()✅(多个 Condition

总结

Java JUC 是构建高并发、高性能、线程安全应用的核心工具库。它通过 CAS、显式锁、并发容器、线程池等机制,解决了传统同步的性能瓶颈和功能局限,是 Java 并发编程的工业级标准。深入理解 JUC 对优化分布式系统、消息中间件等场景至关重要。