当前位置: 首页 > 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.dtcms.com/a/292422.html

相关文章:

  • 牛客NC16625 [NOIP2009]分数线划定(排序)
  • 矿用支架电液控配件3针3孔钢丝编织橡胶护套连接器
  • 基于深度学习的语音情感识别系统的设计与实现【BiLSTM、多层感知神经网络、Emotion2Vec、与CustomFeature】
  • 对随机生成的html文件做标签简析
  • RPA软件机器人如何提高工作效率?
  • python 中什么是作用域(Scope)?为什么函数内部的变量在外部无法访问?
  • 【华为机试】547. 省份数量
  • How script location, CWD, and relative imports interact
  • TIM定时中断
  • 操作系统:系统调用(System Calls)
  • 风险识别清单:构建动态化的风险管理体系
  • 从 0 到 1 搞定 Intel 核显推流:硬件视频编码环境安装完整学习笔记
  • UE5 UI 水平框
  • GoLand 部署第一个项目
  • 智慧制造合同解决方案
  • 外网访问内部私有局域网方案,解决运营商只分配内网IP不给公网IP问题
  • 【Docker】Docker的初步认识以及Ubuntu下的Docker环境安装、配置
  • iOS加固工具有哪些?从零源码到深度混淆的全景解读
  • 【Spring Boot】Spring Boot循环依赖破解:@Lazy与Setter注入的取舍指南(流程图修复版)
  • p5.js 圆弧的用法
  • 一键生成流程图,省时省力!
  • 网络安全基础作业三
  • ubuntu24.04安装CUDA、VLLM、Pytorch等并部署Qwen3-8B-AWQ【50系显卡通用】
  • pytorch 演示 “变分状态空间模型(Variational State-Space Model, VSSM)“ 基于 MINIST数据集
  • CSS中的transform
  • 算法笔记之堆排序
  • Oracle数据恢复—Oracle数据库所在分区被删除后报错的数据恢复案例
  • Oracle 12c 创建数据库初级教程
  • sqli-labs通关笔记-第14关 POST报错型注入(双引号闭合 手工注入+脚本注入两种方法)
  • mac实现sudo命切换node版本