并发 -- JUC(java.util.concurrent) 包的简单介绍

发布于:2025-09-02 ⋅ 阅读:(20) ⋅ 点赞:(0)

1️⃣ JUC 包概述

   java.util.concurrent(简称 JUC)是 Java 5 引入的并发工具包,用于解决多线程编程中的复杂问题,主要特点:

  • 提供线程安全的类和工具

  • 提供高性能的并发数据结构

  • 提供线程池和任务调度机制

  • 提供原子操作类和锁机制,替代传统 synchronizedwait/notify


2️⃣ 核心概念

2.1 锁机制

  • ReentrantLock

    • 可重入锁,类似 synchronized,支持公平锁和非公平锁

    • 方法:

      • lock() / unlock()

      • tryLock()

      • lockInterruptibly()

    • 支持 Condition,实现类似 wait/notify 功能

  • ReadWriteLock / ReentrantReadWriteLock

    • 读写锁,支持多读单写

    • 方法:

      • readLock().lock() / readLock().unlock()

      • writeLock().lock() / writeLock().unlock()

  • StampedLock

    • 更高性能的锁,支持乐观读锁


2.2 并发集合

  • ConcurrentHashMap

    • 高性能线程安全哈希表,替代 Hashtable

    • JDK1.8 后基于 CAS + 链表/红黑树

  • CopyOnWriteArrayList / CopyOnWriteArraySet

    • 读多写少场景,写操作会复制数组

  • BlockingQueue(阻塞队列)

    • 常用实现:

      • ArrayBlockingQueue(数组队列,有界)

      • LinkedBlockingQueue(链表队列,可选界)

      • PriorityBlockingQueue(优先级队列)

      • DelayQueue(延迟队列)

    • 支持阻塞操作:put()take()


2.3 线程池

  • Executor / ExecutorService

    • Executor:执行任务接口

    • ExecutorService:可提交任务、管理线程池

  • ThreadPoolExecutor

    • 核心类,线程池底层实现

    • 关键参数:

      • corePoolSizemaximumPoolSize

      • keepAliveTime

      • BlockingQueue<Runnable>

      • 拒绝策略(AbortPolicy、CallerRunsPolicy 等)

  • ScheduledThreadPoolExecutor

    • 支持定时/周期性任务

  • Executors 工具类

    • 创建常用线程池:

      • newFixedThreadPool(n)

      • newCachedThreadPool()

      • newSingleThreadExecutor()

      • newScheduledThreadPool(n)


2.4 同步辅助类

  • CountDownLatch

    • 用于等待其他线程完成,倒计时锁存器

  • CyclicBarrier

    • 用于多个线程相互等待,屏障同步

  • Semaphore

    • 信号量,控制同时访问资源的线程数量

  • Exchanger

    • 两个线程交换数据


2.5 原子操作类

  • AtomicInteger / AtomicLong / AtomicReference

    • 基于 CAS 实现,原子更新变量

    • 方法:get() / set() / incrementAndGet() / compareAndSet()


2.6 Future & Callable

  • Callable<V>

    • 可返回结果的任务

  • Future<V>

    • 表示异步计算结果,可 get() 阻塞获取结果

  • FutureTask<V>

    • 可作为 Runnable 使用,也可作为 Future 获取结果


2.7 LockSupport

  • 提供低级阻塞/唤醒方法

  • park() 阻塞当前线程

  • unpark(thread) 唤醒指定线程

  • 是 JUC 中很多工具类(如 ConcurrentLinkedQueue)的底层实现基础


3️⃣ 使用建议

  1. :优先使用 JUC 提供的 ReentrantLock 或读写锁,避免手动 synchronized 复杂场景。

  2. 集合:推荐使用 ConcurrentHashMapCopyOnWriteArrayList,而非手动同步 HashMap / ArrayList

  3. 线程池:尽量使用线程池而不是自己创建 Thread,控制线程数量,减少资源消耗。

  4. 同步辅助类:合理选择 CountDownLatchCyclicBarrierSemaphore 等,解决复杂线程协调问题。

  5. 原子操作:简单计数、状态标记优先考虑 AtomicInteger 等原子类,避免锁。


📌 总结:
JUC 包是 Java 并发编程的核心工具箱,它提供了:

  • 锁机制(可替代 synchronized)

  • 线程池(高效管理线程)

  • 原子操作类(无锁线程安全)

  • 并发集合(线程安全容器)

  • 同步辅助工具(线程协调与控制)

  • Future/Callable(异步任务管理)