✨ 专栏Java零基础全套入门连载教程 简介本文承接上篇线程池核心内容正式进入Java高阶并发 JUC 源码级精讲阶段。JUCjava.util.concurrent是Java官方提供的并发工具包是解决高并发、线程安全、并发控制的核心基石也是后端面试高频压轴考点、进阶开发必备技能。前面学的synchronized、线程池只是并发基础真正的Java高并发编程核心全部在JUC包中。本文从零通俗拆解AQS底层原理、Lock显式锁、两大并发控制工具、线程安全并发容器搭配全套可运行实战代码、场景选型、面试知识点、企业最佳实践零基础彻底吃透JUC核心 标签Java JUC,AQS,Lock锁,CountDownLatch,Semaphore,并发容器,Java高并发一、前言在前面多线程、线程池章节中我们掌握了线程创建、线程安全、锁机制、线程池优化等基础并发能力。但仅仅依靠synchronized 线程池完全无法应对复杂高并发业务场景synchronized是重量级锁灵活性差、无法中断、无法超时无法精准控制多线程并发协作、等待、唤醒逻辑普通集合ArrayList、HashMap线程不安全并发操作数据错乱缺少批量任务等待、流量限流、资源抢占等并发能力为此JDK1.5 推出了JUC并发工具包彻底升级Java并发能力是现代Java高并发开发的核心标准。读完本篇你将彻底掌握JUC核心全家桶JUC整体架构与核心组件分类AQS队列同步器底层核心原理JUC灵魂ReentrantLock显式锁与synchronized对比选型CountDownLatch倒计时计数器实战任务批量等待Semaphore信号量实战并发限流、资源抢占主流并发容器特性、场景与底层原理JUC面试核心考点与企业级开发最佳实践二、JUC整体架构认知2.1 什么是JUCJUC全称java.util.concurrent是JDK1.5引入的并发编程工具包专门用于解决多线程并发安全、线程协作、并发控制、高性能并发场景问题。2.2 JUC核心四大模块锁体系Lock、ReentrantLock、ReadWriteLock替代优化synchronized同步器工具CountDownLatch、Semaphore、CyclicBarrier控制线程协作并发容器ConcurrentHashMap、CopyOnWriteArrayList等线程安全集合线程池体系Executor、ThreadPoolExecutor上一篇已精讲三、JUC灵魂AQS队列同步器必懂原理AQSAbstractQueuedSynchronizer是JUC所有锁、同步工具的底层核心是JUC的灵魂Lock、CountDownLatch、Semaphore底层全部基于AQS实现。3.1 AQS核心作用AQS是一个抽象队列同步器用于统一管理线程的锁获取、锁释放、线程阻塞、线程唤醒逻辑极大简化了并发工具的开发难度。3.2 AQS两大核心成员state 状态变量int类型核心变量代表锁状态/资源数量0无锁、资源空闲0有锁、资源已占用CLH双向阻塞队列存储所有抢锁失败、进入阻塞等待的线程排队等待锁释放3.3 AQS核心执行流程线程尝试修改AQS的state变量抢锁抢锁成功执行业务逻辑抢锁失败当前线程封装为节点加入CLH阻塞队列线程休眠持有锁的线程执行完毕释放锁、修改state状态唤醒队列头部等待线程继续抢锁执行任务所有JUC锁工具底层全部遵循这套AQS逻辑只是对state状态的解读不同。四、ReentrantLock显式锁精讲替代synchronized4.1 核心概述ReentrantLock可重入锁是Lock接口的核心实现类基于AQS实现是synchronized的升级版、增强版锁。可重入同一线程可多次获取同一把锁不会自己阻塞自己。4.2 ReentrantLock实战代码importjava.util.concurrent.locks.Lock;importjava.util.concurrent.locks.ReentrantLock;publicclassReentrantLockDemo{// 创建可重入锁privatestaticfinalLockLOCKnewReentrantLock();privatestaticintcount0;publicstaticvoidmain(String[]args)throwsInterruptedException{// 多线程自增保证线程安全Threadt1newThread(()-{for(inti0;i10000;i){LOCK.lock();// 手动加锁try{count;}finally{LOCK.unlock();// 手动解锁必须放在finally}}});Threadt2newThread(()-{for(inti0;i10000;i){LOCK.lock();try{count;}finally{LOCK.unlock();}}});t1.start();t2.start();t1.join();t2.join();// 结果稳定20000线程安全System.out.println(最终结果count);}}4.3 ReentrantLock 与 synchronized 核心区别面试必背锁类型synchronized 隐式锁自动加解锁ReentrantLock 显式锁手动控制灵活性synchronized 功能单一Lock 支持超时锁、可中断锁、公平锁锁机制synchronized JVM底层实现Lock 基于AQS代码实现公平锁synchronized 非公平锁Lock 支持公平/非公平锁切换性能JDK1.6后synchronized优化后性能持平Lock高并发下Lock更灵活4.4 公平锁与非公平锁非公平锁默认线程抢锁随机不排队吞吐量高可能线程饥饿公平锁严格按照队列顺序抢锁先到先得无饥饿吞吐量略低// true公平锁 false非公平锁默认ReentrantLocklocknewReentrantLock(true);五、CountDownLatch 倒计时计数器任务批量等待5.1 核心作用CountDownLatch倒计时闭锁允许一个主线程等待多个子线程全部执行完毕后再继续执行后续逻辑。底层基于AQSstate初始化为任务数每完成一个任务state-1state0时唤醒等待主线程。5.2 核心APICountDownLatch(int count)初始化等待任务数量countDown()任务完成计数器-1await()主线程阻塞等待计数器归0自动唤醒5.3 实战场景多任务并行主线程汇总结果importjava.util.concurrent.CountDownLatch;publicclassCountDownLatchDemo{publicstaticvoidmain(String[]args)throwsInterruptedException{// 初始化5个任务CountDownLatchlatchnewCountDownLatch(5);for(inti1;i5;i){inttaskIdi;newThread(()-{System.out.println(子线程任务taskId执行完毕);// 任务完成计数器减1latch.countDown();}).start();}// 主线程阻塞等待所有子线程完成latch.await();System.out.println(所有子任务执行完毕主线程开始汇总结果);}}5.4 注意事项CountDownLatch只能使用一次计数器归零后无法重置如需循环使用请用 CyclicBarrier。六、Semaphore 信号量限流、资源抢占6.1 核心作用Semaphore信号量用于控制并发线程数量、资源抢占、接口限流通俗理解就是许可证控制器。底层AQS的state代表许可证数量线程获取许可证才能执行执行完毕归还许可证。6.2 核心APISemaphore(int permits)初始化许可证数量最大并发数acquire()获取许可证无则阻塞等待release()归还许可证6.3 实战场景限制最大并发数限流importjava.util.concurrent.Semaphore;publicclassSemaphoreDemo{// 限制同时最多3个线程并发执行privatestaticfinalSemaphoreSEMAPHOREnewSemaphore(3);publicstaticvoidmain(String[]args){// 模拟10个并发请求for(inti1;i10;i){intnumi;newThread(()-{try{// 获取许可证SEMAPHORE.acquire();System.out.println(线程num获取资源执行业务);Thread.sleep(2000);}catch(InterruptedExceptione){e.printStackTrace();}finally{// 归还许可证SEMAPHORE.release();}}).start();}}}6.4 适用场景接口限流、服务熔断降级数据库、文件、硬件资源抢占控制批量任务并发数限制防止服务过载七、JUC并发容器精讲线程安全集合普通集合ArrayList、HashMap线程不安全并发操作会出现数据覆盖、空指针、并发修改异常。JUC提供全套高性能线程安全容器替代传统Vector、HashTable性能极差。7.1 CopyOnWriteArrayList线程安全List核心原理写时复制读操作无锁、并发高效写操作复制新数组修改修改完成替换原数组。优缺点与场景优点读写分离、读性能极高、线程绝对安全缺点写操作需要复制数组内存开销大不适合高频写场景场景读多写少配置列表、白名单、静态数据importjava.util.concurrent.CopyOnWriteArrayList;publicclassCopyOnWriteListDemo{publicstaticvoidmain(String[]args){CopyOnWriteArrayListStringlistnewCopyOnWriteArrayList();// 多线程并发读写无并发异常newThread(()-list.add(test1)).start();newThread(()-list.add(test2)).start();System.out.println(list);}}7.2 ConcurrentHashMap高并发Map面试重中之重JDK1.7与1.8底层原理差异巨大是Java并发核心考点。底层原理对比JDK1.7分段锁 Segment将Map分为16段每段独立加锁提升并发JDK1.8数组链表红黑树放弃分段锁采用CAS synchronized锁链表头节点锁粒度更细、并发性能更高核心特性线程安全、高并发性能优异key、value 不允许为null区别于HashMap支持并发读写、高效扩容7.3 其他常用并发容器CopyOnWriteArraySet线程安全Set底层依赖CopyOnWriteArrayListArrayBlockingQueue有界阻塞队列线程安全常用于线程池任务队列LinkedBlockingQueue无界/有界阻塞队列高并发任务缓冲八、JUC核心面试总结与最佳实践8.1 高频面试考点AQS底层原理、state变量与CLH队列作用synchronized与ReentrantLock区别、公平锁非公平锁CountDownLatch与CyclicBarrier区别Semaphore限流原理与使用场景CopyOnWrite写时复制原理、优缺点ConcurrentHashMap1.7与1.8底层差异8.2 企业开发最佳实践读多写少场景优先使用CopyOnWriteArrayList杜绝ArrayList并发使用高并发键值存储一律使用ConcurrentHashMap禁止HashMap并发操作批量任务等待汇总使用CountDownLatch接口限流使用Semaphore复杂锁逻辑、需要超时/可中断锁场景优先使用ReentrantLock阻塞队列优先使用有界队列杜绝无界队列OOM风险九、本篇总结本篇彻底攻克Java JUC并发核心全家桶完成Java并发编程从入门到进阶的闭环掌握JUC整体架构、四大核心模块建立并发知识体系吃透JUC灵魂AQS底层原理理解所有锁与同步工具的本质熟练使用ReentrantLock掌握与synchronized的选型差异掌握CountDownLatch批量任务等待、Semaphore并发限流实战用法精通主流线程安全并发容器特性、原理与业务场景熟记JUC高频面试考点与企业级开发规范JUC是Java进阶、面试、高并发项目开发的核心分水岭学好本篇内容彻底摆脱初级多线程开发具备中级Java后端并发开发能力十、下期预告下一篇Java 异常多线程JUC 面试全集高频真题标准答案避坑汇总汇总本专栏所有并发、异常核心面试题整理全网高频真题、标准答案、易错点解析一站式搞定Java基础并发面试求职刷题必备持续更新Java零基础全套连载关注专栏从零学Java稳步进阶后端开发
【Java零基础连载18】Java JUC并发包精讲|Lock、AQS、CountDownLatch、Semaphore、并发容器详解
发布时间:2026/7/13 15:24:42
✨ 专栏Java零基础全套入门连载教程 简介本文承接上篇线程池核心内容正式进入Java高阶并发 JUC 源码级精讲阶段。JUCjava.util.concurrent是Java官方提供的并发工具包是解决高并发、线程安全、并发控制的核心基石也是后端面试高频压轴考点、进阶开发必备技能。前面学的synchronized、线程池只是并发基础真正的Java高并发编程核心全部在JUC包中。本文从零通俗拆解AQS底层原理、Lock显式锁、两大并发控制工具、线程安全并发容器搭配全套可运行实战代码、场景选型、面试知识点、企业最佳实践零基础彻底吃透JUC核心 标签Java JUC,AQS,Lock锁,CountDownLatch,Semaphore,并发容器,Java高并发一、前言在前面多线程、线程池章节中我们掌握了线程创建、线程安全、锁机制、线程池优化等基础并发能力。但仅仅依靠synchronized 线程池完全无法应对复杂高并发业务场景synchronized是重量级锁灵活性差、无法中断、无法超时无法精准控制多线程并发协作、等待、唤醒逻辑普通集合ArrayList、HashMap线程不安全并发操作数据错乱缺少批量任务等待、流量限流、资源抢占等并发能力为此JDK1.5 推出了JUC并发工具包彻底升级Java并发能力是现代Java高并发开发的核心标准。读完本篇你将彻底掌握JUC核心全家桶JUC整体架构与核心组件分类AQS队列同步器底层核心原理JUC灵魂ReentrantLock显式锁与synchronized对比选型CountDownLatch倒计时计数器实战任务批量等待Semaphore信号量实战并发限流、资源抢占主流并发容器特性、场景与底层原理JUC面试核心考点与企业级开发最佳实践二、JUC整体架构认知2.1 什么是JUCJUC全称java.util.concurrent是JDK1.5引入的并发编程工具包专门用于解决多线程并发安全、线程协作、并发控制、高性能并发场景问题。2.2 JUC核心四大模块锁体系Lock、ReentrantLock、ReadWriteLock替代优化synchronized同步器工具CountDownLatch、Semaphore、CyclicBarrier控制线程协作并发容器ConcurrentHashMap、CopyOnWriteArrayList等线程安全集合线程池体系Executor、ThreadPoolExecutor上一篇已精讲三、JUC灵魂AQS队列同步器必懂原理AQSAbstractQueuedSynchronizer是JUC所有锁、同步工具的底层核心是JUC的灵魂Lock、CountDownLatch、Semaphore底层全部基于AQS实现。3.1 AQS核心作用AQS是一个抽象队列同步器用于统一管理线程的锁获取、锁释放、线程阻塞、线程唤醒逻辑极大简化了并发工具的开发难度。3.2 AQS两大核心成员state 状态变量int类型核心变量代表锁状态/资源数量0无锁、资源空闲0有锁、资源已占用CLH双向阻塞队列存储所有抢锁失败、进入阻塞等待的线程排队等待锁释放3.3 AQS核心执行流程线程尝试修改AQS的state变量抢锁抢锁成功执行业务逻辑抢锁失败当前线程封装为节点加入CLH阻塞队列线程休眠持有锁的线程执行完毕释放锁、修改state状态唤醒队列头部等待线程继续抢锁执行任务所有JUC锁工具底层全部遵循这套AQS逻辑只是对state状态的解读不同。四、ReentrantLock显式锁精讲替代synchronized4.1 核心概述ReentrantLock可重入锁是Lock接口的核心实现类基于AQS实现是synchronized的升级版、增强版锁。可重入同一线程可多次获取同一把锁不会自己阻塞自己。4.2 ReentrantLock实战代码importjava.util.concurrent.locks.Lock;importjava.util.concurrent.locks.ReentrantLock;publicclassReentrantLockDemo{// 创建可重入锁privatestaticfinalLockLOCKnewReentrantLock();privatestaticintcount0;publicstaticvoidmain(String[]args)throwsInterruptedException{// 多线程自增保证线程安全Threadt1newThread(()-{for(inti0;i10000;i){LOCK.lock();// 手动加锁try{count;}finally{LOCK.unlock();// 手动解锁必须放在finally}}});Threadt2newThread(()-{for(inti0;i10000;i){LOCK.lock();try{count;}finally{LOCK.unlock();}}});t1.start();t2.start();t1.join();t2.join();// 结果稳定20000线程安全System.out.println(最终结果count);}}4.3 ReentrantLock 与 synchronized 核心区别面试必背锁类型synchronized 隐式锁自动加解锁ReentrantLock 显式锁手动控制灵活性synchronized 功能单一Lock 支持超时锁、可中断锁、公平锁锁机制synchronized JVM底层实现Lock 基于AQS代码实现公平锁synchronized 非公平锁Lock 支持公平/非公平锁切换性能JDK1.6后synchronized优化后性能持平Lock高并发下Lock更灵活4.4 公平锁与非公平锁非公平锁默认线程抢锁随机不排队吞吐量高可能线程饥饿公平锁严格按照队列顺序抢锁先到先得无饥饿吞吐量略低// true公平锁 false非公平锁默认ReentrantLocklocknewReentrantLock(true);五、CountDownLatch 倒计时计数器任务批量等待5.1 核心作用CountDownLatch倒计时闭锁允许一个主线程等待多个子线程全部执行完毕后再继续执行后续逻辑。底层基于AQSstate初始化为任务数每完成一个任务state-1state0时唤醒等待主线程。5.2 核心APICountDownLatch(int count)初始化等待任务数量countDown()任务完成计数器-1await()主线程阻塞等待计数器归0自动唤醒5.3 实战场景多任务并行主线程汇总结果importjava.util.concurrent.CountDownLatch;publicclassCountDownLatchDemo{publicstaticvoidmain(String[]args)throwsInterruptedException{// 初始化5个任务CountDownLatchlatchnewCountDownLatch(5);for(inti1;i5;i){inttaskIdi;newThread(()-{System.out.println(子线程任务taskId执行完毕);// 任务完成计数器减1latch.countDown();}).start();}// 主线程阻塞等待所有子线程完成latch.await();System.out.println(所有子任务执行完毕主线程开始汇总结果);}}5.4 注意事项CountDownLatch只能使用一次计数器归零后无法重置如需循环使用请用 CyclicBarrier。六、Semaphore 信号量限流、资源抢占6.1 核心作用Semaphore信号量用于控制并发线程数量、资源抢占、接口限流通俗理解就是许可证控制器。底层AQS的state代表许可证数量线程获取许可证才能执行执行完毕归还许可证。6.2 核心APISemaphore(int permits)初始化许可证数量最大并发数acquire()获取许可证无则阻塞等待release()归还许可证6.3 实战场景限制最大并发数限流importjava.util.concurrent.Semaphore;publicclassSemaphoreDemo{// 限制同时最多3个线程并发执行privatestaticfinalSemaphoreSEMAPHOREnewSemaphore(3);publicstaticvoidmain(String[]args){// 模拟10个并发请求for(inti1;i10;i){intnumi;newThread(()-{try{// 获取许可证SEMAPHORE.acquire();System.out.println(线程num获取资源执行业务);Thread.sleep(2000);}catch(InterruptedExceptione){e.printStackTrace();}finally{// 归还许可证SEMAPHORE.release();}}).start();}}}6.4 适用场景接口限流、服务熔断降级数据库、文件、硬件资源抢占控制批量任务并发数限制防止服务过载七、JUC并发容器精讲线程安全集合普通集合ArrayList、HashMap线程不安全并发操作会出现数据覆盖、空指针、并发修改异常。JUC提供全套高性能线程安全容器替代传统Vector、HashTable性能极差。7.1 CopyOnWriteArrayList线程安全List核心原理写时复制读操作无锁、并发高效写操作复制新数组修改修改完成替换原数组。优缺点与场景优点读写分离、读性能极高、线程绝对安全缺点写操作需要复制数组内存开销大不适合高频写场景场景读多写少配置列表、白名单、静态数据importjava.util.concurrent.CopyOnWriteArrayList;publicclassCopyOnWriteListDemo{publicstaticvoidmain(String[]args){CopyOnWriteArrayListStringlistnewCopyOnWriteArrayList();// 多线程并发读写无并发异常newThread(()-list.add(test1)).start();newThread(()-list.add(test2)).start();System.out.println(list);}}7.2 ConcurrentHashMap高并发Map面试重中之重JDK1.7与1.8底层原理差异巨大是Java并发核心考点。底层原理对比JDK1.7分段锁 Segment将Map分为16段每段独立加锁提升并发JDK1.8数组链表红黑树放弃分段锁采用CAS synchronized锁链表头节点锁粒度更细、并发性能更高核心特性线程安全、高并发性能优异key、value 不允许为null区别于HashMap支持并发读写、高效扩容7.3 其他常用并发容器CopyOnWriteArraySet线程安全Set底层依赖CopyOnWriteArrayListArrayBlockingQueue有界阻塞队列线程安全常用于线程池任务队列LinkedBlockingQueue无界/有界阻塞队列高并发任务缓冲八、JUC核心面试总结与最佳实践8.1 高频面试考点AQS底层原理、state变量与CLH队列作用synchronized与ReentrantLock区别、公平锁非公平锁CountDownLatch与CyclicBarrier区别Semaphore限流原理与使用场景CopyOnWrite写时复制原理、优缺点ConcurrentHashMap1.7与1.8底层差异8.2 企业开发最佳实践读多写少场景优先使用CopyOnWriteArrayList杜绝ArrayList并发使用高并发键值存储一律使用ConcurrentHashMap禁止HashMap并发操作批量任务等待汇总使用CountDownLatch接口限流使用Semaphore复杂锁逻辑、需要超时/可中断锁场景优先使用ReentrantLock阻塞队列优先使用有界队列杜绝无界队列OOM风险九、本篇总结本篇彻底攻克Java JUC并发核心全家桶完成Java并发编程从入门到进阶的闭环掌握JUC整体架构、四大核心模块建立并发知识体系吃透JUC灵魂AQS底层原理理解所有锁与同步工具的本质熟练使用ReentrantLock掌握与synchronized的选型差异掌握CountDownLatch批量任务等待、Semaphore并发限流实战用法精通主流线程安全并发容器特性、原理与业务场景熟记JUC高频面试考点与企业级开发规范JUC是Java进阶、面试、高并发项目开发的核心分水岭学好本篇内容彻底摆脱初级多线程开发具备中级Java后端并发开发能力十、下期预告下一篇Java 异常多线程JUC 面试全集高频真题标准答案避坑汇总汇总本专栏所有并发、异常核心面试题整理全网高频真题、标准答案、易错点解析一站式搞定Java基础并发面试求职刷题必备持续更新Java零基础全套连载关注专栏从零学Java稳步进阶后端开发