当前位置: 首页 > news >正文

Java并发编程:JUC核心组件全解析

JUC(Java Util Concurrent) 是 Java 并发编程的核心工具包,提供高性能、线程安全的并发控制组件。自 Java 5 引入,它彻底改变了 Java 多线程开发模式,解决了传统 synchronizedwait()/notify() 的局限性。


核心组件概览

类别核心类/接口作用
原子操作类AtomicInteger, LongAdder无锁线程安全计算
锁机制ReentrantLock, StampedLock替代 synchronized 的显式锁
并发集合ConcurrentHashMap, CopyOnWriteArrayList高性能线程安全容器
线程池ThreadPoolExecutor, ForkJoinPool线程资源管理
同步工具CountDownLatch, CyclicBarrier多线程协调
异步编程CompletableFuture响应式编程支持

一、原子操作类(java.util.concurrent.atomic

解决非阻塞算法实现,性能远超 synchronized

典型使用
// 原子计数器
AtomicInteger counter = new AtomicInteger(0);// 并发递增
IntStream.range(0, 100).parallel().forEach(i -> {counter.incrementAndGet();  // 无锁线程安全操作
});
核心类:
  • 基础类型
    AtomicInteger, AtomicLong, AtomicBoolean
  • 引用类型
    AtomicReference<User>, AtomicStampedReference(解决ABA问题)
  • 累加器(Java 8+)
    LongAdder(比 AtomicLong 更高并发性能)

二、锁机制(java.util.concurrent.locks

1. ReentrantLock(可重入锁)
Lock lock = new ReentrantLock();void safeIncrement() {lock.lock();  // 显式加锁try {count++;} finally {lock.unlock(); // 必须finally释放}
}

优势

  • 可中断锁:lockInterruptibly()
  • 尝试获取锁:tryLock(1, TimeUnit.SECONDS)
  • 公平锁模式:new ReentrantLock(true)
2. ReadWriteLock(读写锁)
ReadWriteLock rwLock = new ReentrantReadWriteLock();
Lock readLock = rwLock.readLock();  // 共享读锁
Lock writeLock = rwLock.writeLock(); // 独占写锁
3. StampedLock(Java 8 优化锁)
StampedLock lock = new StampedLock();// 乐观读(无锁尝试)
long stamp = lock.tryOptimisticRead();
if (!lock.validate(stamp)) {stamp = lock.readLock();  // 升级为悲观读try { /* 读取操作 */ } finally { lock.unlockRead(stamp); }
}

三、并发集合

1. ConcurrentHashMap
ConcurrentHashMap<String, Integer> map = new ConcurrentHashMap<>();// 线程安全的putIfAbsent
map.computeIfAbsent("key", k -> 1);// 并行操作(Java 8+)
map.forEach(2, (k, v) -> System.out.println(k + ":" + v));

特点

  • 分段锁(JDK 7)→ CAS + 红黑树(JDK 8+)
  • 高并发下性能接近单线程 HashMap
2. 阻塞队列
队列类型特性
ArrayBlockingQueue有界数组队列
LinkedBlockingQueue无界/有界链表队列(默认Integer.MAX_VALUE)
PriorityBlockingQueue优先级阻塞队列
SynchronousQueue无缓冲队列(生产消费必须配对)
// 生产者-消费者模式
BlockingQueue<Task> queue = new ArrayBlockingQueue<>(10);// 生产者
queue.put(task);  // 阻塞直到空间可用// 消费者
Task task = queue.take(); // 阻塞直到元素可用

四、线程池(java.util.concurrent

1. ThreadPoolExecutor
ExecutorService executor = new ThreadPoolExecutor(4,      // 核心线程数10,     // 最大线程数60,     // 空闲线程存活时间(秒)TimeUnit.SECONDS,new ArrayBlockingQueue<>(100), // 工作队列new ThreadFactoryBuilder().setNameFormat("worker-%d").build(),new ThreadPoolExecutor.CallerRunsPolicy() // 拒绝策略
);
2. Executors 工厂方法
// 固定线程池
ExecutorService fixedPool = Executors.newFixedThreadPool(4);// 工作窃取池(Java 7+)
ExecutorService workStealingPool = Executors.newWorkStealingPool();// 定时任务池
ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(2);
scheduler.scheduleAtFixedRate(task, 0, 1, TimeUnit.SECONDS);

五、同步工具类

1. CountDownLatch(倒计时门闩)
CountDownLatch latch = new CountDownLatch(3);// 多个线程完成任务
executor.execute(() -> {doWork();latch.countDown();  // 计数器-1
});latch.await();  // 阻塞直到计数器归零
System.out.println("All tasks completed");
2. CyclicBarrier(循环屏障)
CyclicBarrier barrier = new CyclicBarrier(3, () -> {System.out.println("All threads reached barrier");
});IntStream.range(0, 3).forEach(i -> executor.execute(() -> {prepareWork();barrier.await();  // 等待其他线程continueWork();
}));
3. Semaphore(信号量)
Semaphore semaphore = new Semaphore(3); // 允许3个并发void accessResource() {semaphore.acquire();  // 获取许可try {useResource();} finally {semaphore.release(); // 释放许可}
}

六、异步编程(CompletableFuture,Java 8+)

CompletableFuture.supplyAsync(() -> fetchData())   // 异步任务.thenApply(data -> transform(data))           // 同步转换.thenAcceptAsync(result -> save(result), ioPool) // 异步消费.exceptionally(ex -> handleError(ex));         // 异常处理

核心操作

  • 组合:thenCompose(), thenCombine()
  • 并行:allOf(), anyOf()
  • 超时控制:orTimeout(), completeOnTimeout()(Java 9+)

JUC 设计哲学

  1. 降低锁粒度
    分段锁(ConcurrentHashMap)、读写分离(ReadWriteLock)
  2. 无锁化编程
    CAS 操作(AtomicXXX)、LongAdder
  3. 线程资源复用
    线程池机制避免频繁创建/销毁
  4. 协调而非阻塞
    CountDownLatch/CyclicBarrier 替代 wait/notify

最佳实践

  1. 优先使用并发集合
    替代 Collections.synchronizedXXX()
  2. 线程池资源管理
    禁止使用 Executors.newCachedThreadPool()(易致 OOM)
  3. 锁使用规范
    Lock lock = ...;
    lock.lock();
    try { /* 临界区 */ } 
    finally { lock.unlock(); }  // 必须finally释放
    
  4. 异步编程陷阱
    CompletableFuture 回调链需处理异常

性能对比(示例)

操作synchronizedReentrantLockAtomicLong
1000万次递增 (4线程)1200 ms850 ms210 ms
内存占用
可中断性不支持支持不适用

测试环境:JDK 17, Apple M1 Pro


学习路线

  1. 基础AtomicIntegerReentrantLockConcurrentHashMap
  2. 进阶ThreadPoolExecutorCountDownLatchCompletableFuture
  3. 高级ForkJoinPoolStampedLockPhaser(阶段同步器)

推荐资源

  • 《Java Concurrency in Practice》(并发编程圣经)
  • JUC 源码(Doug Lea 大师之作)
  • Java 官方并发教程:Oracle Concurrency

重要提示:JUC 解决了并发难题,但也引入新复杂度。务必通过 jstackVisualVM 等工具分析线程状态,避免死锁和资源耗尽。

http://www.lryc.cn/news/595956.html

相关文章:

  • IMU(LSM6DSMTR+LIS2MDLTR)
  • 隧道代理与普通代理:一场网络隐身术的“智能革命”
  • 开发者的AI认知指南:用大模型重新理解人工智能(上)
  • 基于AutoJawSegment项目的CBCT图像分割实践指南
  • Qt开发环境搭建全攻略(Windows+Linux+macOS)
  • Navicat 远程连接SQLlite数据库
  • 【NLP舆情分析】基于python微博舆情分析可视化系统(flask+pandas+echarts) 视频教程 - 主页-微博基本信息实现
  • DearMom以“新生儿安全系统”重塑婴儿车价值,揽获CBME双项大奖
  • 数据库隔离级别
  • 在vscode 使用 remote-ssh
  • Vue3 面试题及详细答案120道(16-30 )
  • Baumer工业相机堡盟工业相机如何通过YoloV8深度学习模型实现持械检测(C#代码,UI界面版)
  • 【Altium Designer2025】电子设计自动化(EDA)软件——Altium Designer25版保姆级下载安装详细图文教程(附安装包)
  • ob导出租户所有表记录
  • SpringBoot--Mapper XML 和 Mapper 接口在不同包
  • C++中的list(2)简单复现list中的关键逻辑
  • 文本分类与情感分析Python实战
  • liunx运维进阶脚本
  • 2025.7.25论文阅读
  • VUE2 项目学习笔记 ? 语法 v-if/v-show
  • 为何在 Vue 的 v-model 指令中不能使用可选链(Optional Chaining)?
  • 【Spring Boot】Spring Boot循环依赖破解:@Lazy与Setter注入的取舍指南(流程图修复版)
  • JavaWeb学习打卡10(HttpServletRequest详解应用、获取参数,请求转发实例)
  • 分布在内侧内嗅皮层(MEC)的边界细胞对NLP中的深层语义分析的积极影响和启示
  • 短剧小程序系统开发:重塑影视内容传播格局
  • Python爬虫实战:批量下载亚马逊商品图片
  • java多线程编程自用笔记
  • 日常随笔-React摘要
  • 浅谈——游戏中的各种配置格式
  • C++ 模板库map数据结构的概念和使用案例