【Java零基础连载25】Java 并发编程全集|线程核心、锁机制、线程池、CAS、AQS、并发容器万字详解

发布时间:2026/7/17 20:09:10
【Java零基础连载25】Java 并发编程全集|线程核心、锁机制、线程池、CAS、AQS、并发容器万字详解 ✨ 专栏Java零基础全套入门连载教程 简介并发编程是Java后端进阶分水岭、面试压轴重难点、高性能项目核心基石。日常高并发接口、异步任务、批量处理、微服务调度、中间件底层全部依赖并发思想实现。绝大多数线上CPU飙高、死锁、内存溢出、数据脏读、接口超时问题根源都是并发基础不扎实。本文万字零基础拆解线程核心、线程生命周期、锁体系、volatile、CAS无锁机制、AQS底层原理、七大线程池参数、四种拒绝策略、JUC并发容器、并发工具类配套可运行实战代码、底层原理、避坑方案、满分面试话术一站式吃透Java并发全集 标签Java并发,多线程,锁机制,volatile,CAS,AQS,线程池,JUC并发容器,Java面试一、并发基础核心概念开篇必背1.1 进程与线程面试高频区分满分标准答案进程操作系统资源分配的最小单位独立占用内存、CPU资源进程之间数据隔离、互不干扰例如运行中的JVM、浏览器、微信。线程进程内的执行单元是CPU调度的最小单位一个进程包含多个线程线程共享进程堆内存与方法区资源私有栈内存切换开销极小。核心区别金句进程是资源分配单位线程是执行调度单位进程开销大、隔离性强线程开销小、资源共享。1.2 并发与并行并发Concurrent单核CPU快速轮换执行多个线程宏观同时执行微观交替执行解决任务阻塞、提升CPU利用率。并行Parallel多核CPU同时执行多个线程宏观微观均同时执行真正意义上的多任务同时处理提升任务执行效率。1.3 多线程三大核心问题多线程并发之所以出现线程安全问题根源来自三点所有并发Bug均围绕这三大问题展开可见性一个线程修改共享变量其他线程无法及时感知原子性多线程操作共享变量操作不具备不可分割性出现数据覆盖、错乱有序性CPU与编译器为优化性能会进行指令重排打乱代码执行顺序引发逻辑异常。核心结论volatile解决可见性、有序性锁与CAS解决原子性三者组合覆盖所有并发安全场景。二、线程核心详解与生命周期2.1 线程四种创建方式面试必问2.1.1 继承Thread类优点写法简单、直接启动缺点单继承限制无法继承其他类无返回值。/** * 线程创建方式1继承Thread类 * 特点写法简单无返回值受单继承限制 */classMyThreadextendsThread{Overridepublicvoidrun(){System.out.println(线程执行Thread.currentThread().getName());}}2.1.2 实现Runnable接口优点避免单继承限制、线程任务可复用缺点无返回值、无法抛出异常。/** * 线程创建方式2实现Runnable接口 * 特点规避单继承限制任务可复用无返回值 */classMyRunnableimplementsRunnable{Overridepublicvoidrun(){System.out.println(Runnable线程执行);}}2.1.3 实现Callable接口有返回值优点有返回值、可抛异常支持Future获取执行结果缺点写法相对繁琐需配合FutureTask使用。/** * 线程创建方式3实现Callable接口 * 特点支持返回值、可抛出异常需配合FutureTask使用 */importjava.util.concurrent.Callable;classMyCallableimplementsCallableInteger{OverridepublicIntegercall()throwsException{System.out.println(Callable线程执行计算结果);return666;}}2.1.4 线程池创建企业开发首选企业开发禁止手动创建线程统一使用线程池可复用线程、控制并发数、减少创建销毁开销后文详细拆解。2.2 线程六大生命周期满分背诵JDK官方定义线程六大状态全部位于Thread.State枚举中NEW新建线程对象创建完成未调用start()未启动RUNNABLE就绪/运行包含就绪、运行两种状态调用start()后等待CPU调度或正在执行BLOCKED阻塞等待获取synchronized内置锁未拿到锁进入阻塞队列WAITING无限等待无时限等待需手动唤醒调用wait()、join()进入TIMED_WAITING限时等待限时等待时间到自动唤醒调用sleep()、wait(time)进入TERMINATED终止线程代码执行完毕或异常终止生命周期结束。2.3 高频线程方法区别面试必考2.3.1 sleep() vs wait()对比维度sleep()wait()所属类Thread类静态方法Object类成员方法锁释放不释放锁抱着锁休眠释放锁其他线程可竞争锁唤醒方式时间到自动唤醒需notify()/notifyAll()手动唤醒使用场景单纯延时休眠线程间通信、资源等待2.3.2 yield() vs join()yield()线程主动让出CPU执行权回到就绪状态不释放锁仅让步不阻塞join()主线程等待子线程执行完毕再继续执行实现线程执行顺序控制。三、Java锁机制全集同步锁显式锁3.1 锁核心分类Java锁体系分为两大核心synchronized内置锁JVM层面、Lock显式锁代码层面适配不同并发场景。3.2 synchronized 内置锁重点核心特性可重入、独占式、自动加锁解锁、无需手动释放、异常自动释放锁、底层依赖JVM实现。3.2.1 三种使用方式修饰普通方法锁当前对象this修饰静态方法锁当前类Class对象全局唯一修饰代码块锁自定义对象粒度最细、性能最优。3.2.2 JDK1.6锁升级机制面试压轴为优化synchronized性能JDK1.6引入锁升级机制锁状态单向不可逆升级无锁初始状态无线程竞争偏向锁单线程无竞争场景偏向首个获取锁的线程无加锁开销轻量级锁多线程轻微竞争基于CAS自旋尝试获取锁无阻塞重量级锁线程激烈竞争CAS自旋失败线程进入阻塞队列依赖操作系统调度开销最大。核心结论synchronized不再是重型锁无竞争场景下性能媲美Lock低并发场景优先使用。3.3 Lock 显式锁ReentrantLock核心特性可重入、可中断、可超时、支持公平锁/非公平锁、手动加锁解锁、粒度灵活。/** * ReentrantLock 显式锁标准使用案例 * 规范必须通过try-finally确保锁释放避免异常死锁 * 支持公平/非公平锁、可中断、超时加锁 */importjava.util.concurrent.locks.ReentrantLock;publicclassLockDemo{// 传true为公平锁默认非公平锁privatestaticfinalReentrantLockLOCKnewReentrantLock(true);publicstaticvoidmain(String[]args){LOCK.lock();try{// 线程安全临界区代码System.out.println(显式锁执行临界区逻辑);}finally{// 最终释放锁杜绝死锁LOCK.unlock();}}}3.4 synchronized vs ReentrantLock 终极对比对比维度synchronizedReentrantLock实现层面JVM底层原生实现JDK代码层面实现AQS加锁解锁自动加锁、自动释放手动lock()、unlock()锁类型非公平锁、不可中断支持公平/非公平、可中断、可超时性能JDK1.6后优化低并发性能优秀高并发、复杂场景性能更优适用场景简单同步、低并发场景高并发、锁竞争激烈、需精细化控制3.5 读写锁 ReentrantReadWriteLock核心思想读写分离、读多写少优化读锁共享锁多线程可同时读提升查询吞吐量写锁独占锁写操作独占资源保证数据一致性互斥规则读读共享、读写互斥、写写互斥。适用场景读多写少业务如配置缓存、商品数据、字典数据。四、volatile 关键字轻量级并发核心4.1 volatile 三大核心作用满分背诵volatile是轻量级同步关键字不依赖锁机制性能极高核心能力三点保证可见性一个线程修改volatile变量立即刷新主内存其他线程实时感知最新值禁止指令重排通过内存屏障禁止编译器、CPU对volatile变量前后指令重排序不保证原子性仅保证单变量读写安全不支持复合操作i、i1。4.2 为什么不保证原子性i 操作分为三步读取值 → 运算1 → 赋值volatile只能保证每一步可见有序无法保证三步操作整体不可分割多线程并发会出现数据覆盖、丢失更新问题。4.3 典型使用场景状态标记位线程启停标记、全局开关双重检查锁DCL单例模式禁止指令重排、保证可见性简单变量读写无需复合运算的场景。五、CAS 无锁机制乐观锁核心5.1 CAS 核心原理CASCompare And Swap比较并交换是无锁乐观锁机制全程无阻塞、无锁开销高并发性能远超重量级锁。执行流程获取内存中变量的旧预期值比较当前内存值与旧值是否一致一致则更新为新值操作成功不一致则说明被其他线程修改重试直至成功。5.2 CAS 优缺点优点无锁阻塞、线程无需挂起、CPU利用率高、并发性能优异。缺点ABA问题变量从A改B再改回ACAS无法感知数据被修改过自旋空转竞争激烈时无限重试消耗CPU资源只能保证单变量原子性无法保证多变量复合操作原子性。5.3 ABA 问题解决方案使用AtomicStampedReference通过「变量值版本号」双重校验每次修改版本号自增彻底解决ABA问题。5.4 JUC原子类实战/** * CAS原子类实战演示 * AtomicInteger 基于CAS无锁实现线程安全计数 * 无锁阻塞并发性能优于synchronized */importjava.util.concurrent.atomic.AtomicInteger;publicclassCASDemo{// 初始化原子计数器privatestaticfinalAtomicIntegerCOUNTnewAtomicInteger(0);publicstaticvoidmain(String[]args)throwsInterruptedException{// 10个线程各累加1000次for(inti0;i10;i){newThread(()-{for(intj0;j1000;j){COUNT.getAndIncrement();}}).start();}Thread.sleep(2000);// 最终结果严格为10000保证线程安全System.out.println(最终计数结果COUNT.get());}}核心结论所有JUC原子类底层均基于CAS实现是JUC并发包的底层基石。六、AQS 同步队列器JUC底层核心AQSAbstractQueuedSynchronizer是Java并发编程顶层底层框架Lock锁、线程池、CountDownLatch、Semaphore 全部基于AQS实现是JUC工具类的核心基石。6.1 AQS 三大核心组件state同步状态变量volatile修饰的int变量代表锁状态0为无锁、1为加锁、大于1为可重入次数双向阻塞队列竞争锁失败的线程封装为Node节点进入队列排队等待唤醒独占/共享模式独占模式ReentrantLock、共享模式读写锁、计数器。6.2 AQS 核心执行流程线程尝试通过CAS修改state状态抢占锁抢占成功执行业务逻辑抢占失败封装为Node节点加入双向阻塞队列前驱节点执行完毕释放锁唤醒当前节点线程再次尝试抢占锁循环往复直至所有线程执行完毕。6.3 AQS 核心作用面试满分AQS封装了线程排队、阻塞、唤醒、竞争的通用逻辑开发者只需自定义state状态修改规则即可快速实现各类同步工具无需重复编写底层队列与线程调度逻辑统一了Java并发同步组件的底层实现。七、线程池万字详解企业核心面试压轴核心金句企业开发禁止使用Executors创建线程池必须手动通过ThreadPoolExecutor自定义规避资源耗尽风险。7.1 线程池核心优势复用线程避免频繁创建、销毁线程节省系统开销控制并发限制最大并发线程数防止线程无限创建导致OOM、CPU飙高统一管理统一调度、监控、执行任务适配异步、批量、延时场景。7.2 七大核心参数必背必考corePoolSize 核心线程数常驻线程线程池初始化后保留不会被回收maximumPoolSize 最大线程数线程池允许的最大线程总数控制并发上限keepAliveTime 空闲超时时间非核心线程空闲超时后自动回收unit 时间单位空闲时间单位workQueue 任务阻塞队列存储等待执行的任务核心线程满负载后任务入队threadFactory 线程工厂自定义线程创建规则、线程名称、优先级handler 拒绝策略队列满、线程数达上限触发任务拒绝规则。7.3 线程池执行流程满分背诵接收新任务判断当前运行线程数是否小于核心线程数小于则新建核心线程执行任务核心线程已满判断阻塞队列是否未满未满则任务入队等待队列已满判断当前线程数是否小于最大线程数小于则新建非核心线程执行任务线程数已达最大值、队列已满触发拒绝策略。7.4 四种拒绝策略面试必问AbortPolicy默认直接抛出异常阻止任务执行便于发现并发过载问题CallerRunsPolicy调用者线程自行执行任务不丢弃、不报错降低并发压力DiscardPolicy直接丢弃当前新任务无异常、无日志业务慎用DiscardOldestPolicy丢弃队列最旧任务执行当前新任务适合时效性优先场景。7.5 禁止使用Executors的原因避坑核心newFixedThreadPool无界队列任务堆积过多引发OOMnewCachedThreadPool最大线程数无上限线程无限创建耗尽CPU与内存newSingleThreadExecutor无界队列任务堆积OOM风险newScheduledThreadPool线程数无上限高并发资源耗尽。企业规范全部使用ThreadPoolExecutor 手动创建线程池自定义参数与拒绝策略。7.6 线程池参数配置规范实战最优CPU密集型任务核心线程数 CPU核心数 1减少线程上下文切换IO密集型任务核心线程数 CPU核心数 * 2充分利用CPU空闲时间业务耗时IO可适当放大线程数根据接口吞吐量压测微调。7.7 标准线程池实战代码可直接上线/** * 企业生产级线程池配置示例 * 禁止使用Executors手动创建ThreadPoolExecutor * 自定义参数、有界队列、合理拒绝策略规避OOM与资源耗尽风险 */importjava.util.concurrent.*;publicclassThreadPoolDemo{// 获取当前设备CPU核心数privatestaticfinalintCPU_NUMRuntime.getRuntime().availableProcessors();// 全局自定义线程池privatestaticfinalThreadPoolExecutorTHREAD_POOLnewThreadPoolExecutor(CPU_NUM1,// 核心线程数CPU_NUM*2,// 最大线程数10L,// 非核心线程空闲超时时间TimeUnit.SECONDS,// 时间单位newArrayBlockingQueue(100),// 有界阻塞队列限制任务堆积Executors.defaultThreadFactory(),// 默认线程工厂newThreadPoolExecutor.CallerRunsPolicy()// 饱和拒绝策略);publicstaticvoidmain(String[]args){// 批量提交任务for(inti0;i20;i){intindexi;THREAD_POOL.execute(()-{System.out.println(线程执行任务index线程名Thread.currentThread().getName());});}// 优雅关闭线程池THREAD_POOL.shutdown();}}八、JUC并发工具类与并发容器8.1 三大并发工具类面试高频8.1.1 CountDownLatch倒计时计数器作用等待多个子线程执行完毕主线程再执行适用于批量任务同步等待。特点一次性使用倒计时结束后无法重置。8.1.2 CyclicBarrier循环栅栏作用多个线程互相等待全部到达屏障点后再统一执行支持循环复用。特点可重复使用适合分段任务、多轮并发计算场景。8.1.3 Semaphore信号量作用控制并发线程数量实现限流、资源抢占适用于接口限流、连接池控制。8.2 并发容器核心原理8.2.1 ConcurrentHashMap并发Map王者核心特性线程安全、高并发性能优异替代HashMap与HashTable。JDK1.8底层原理数组链表红黑树采用CAS synchronized分段锁锁粒度细化到桶节点并发性能大幅提升。对比HashTableHashTable是全局锁并发串行执行ConcurrentHashMap是桶级锁多线程可并行操作不同桶并发效率极高。8.2.2 并发队列ConcurrentLinkedQueue无锁并发队列CAS实现高并发无阻塞LinkedBlockingQueue阻塞队列可用于线程池、生产者消费者模型。九、并发高频面试真题满分背诵版9.1 为什么volatile不能保证原子性标准答案volatile仅能保证变量读写的可见性与有序性无法保证复合操作的原子性。类似i的操作分为读取、运算、赋值三步多线程并发时三步操作会出现穿插覆盖volatile无法锁定整体操作因此不能保证原子性原子性需依靠锁或CAS保障。9.2 AQS的核心原理是什么标准答案AQS是JUC并发组件的底层同步框架核心基于state同步状态变量 双向阻塞队列实现。线程通过CAS竞争state锁状态竞争失败则封装为节点进入队列阻塞排队前驱节点释放锁后唤醒后继节点完成线程调度所有锁、线程池、并发工具类均基于AQS扩展实现。9.3 线程池为什么不允许使用Executors标准答案Executors创建的线程池存在严重资源风险部分线程池无界队列会导致任务无限堆积引发OOM部分线程池无最大线程限制会导致线程无限创建耗尽CPU与内存资源。企业开发必须手动使用ThreadPoolExecutor自定义线程池精准控制队列长度、最大线程数、拒绝策略规避线上风险。9.4 synchronized和Lock如何选型标准答案低并发、简单同步场景优先使用synchronizedJDK1.6后锁升级优化性能优异、写法简洁、自动释放锁无死锁风险高并发、锁竞争激烈、需要公平锁、可中断、超时释放等精细化控制场景优先使用ReentrantLock灵活度与并发性能更优。9.5 CAS的优缺点与ABA解决方案标准答案CAS优点是无锁阻塞、CPU利用率高、并发性能优异缺点是存在ABA问题、高竞争空转消耗CPU、仅支持单变量原子操作。ABA问题核心解决方案是使用AtomicStampedReference通过版本号机制记录变量修改次数精准识别数据篡改彻底规避ABA隐患。十、本篇总结本文全方位拆解Java并发编程全集核心重难点从零吃透线程、锁、volatile、CAS、AQS、线程池、JUC工具类、并发容器所有知识点全覆盖开发实战与面试压轴考点掌握线程核心概念、生命周期、常用方法区别彻底理清并发底层基础精通synchronized锁升级、ReentrantLock显式锁、读写锁精准选型各类锁场景吃透volatile、CAS无锁机制理解并发三大特性的解决方案掌握AQS底层队列同步原理读懂所有JUC并发组件底层源码熟练使用企业标准线程池规避OOM、CPU飙高、任务堆积等线上并发Bug掌握JUC并发工具类与并发容器适配高并发业务开发吃透高频面试真题。熟练掌握本篇内容可彻底攻克Java并发难点具备独立开发高并发业务、排查线上并发问题、应对大厂并发面试压轴提问的能力下期预告下一篇Java IO与NIO全集BIO/NIO/AIO区别、缓冲区、通道、多路复用、零拷贝、面试万字详解深耕Java IO核心体系从零讲解传统BIO阻塞IO、NIO非阻塞IO、AIO异步IO核心原理拆解Buffer缓冲区、Channel通道、Selector多路复用器、文件零拷贝机制、Netty底层核心基础全覆盖IO开发与面试重难点持续更新Java零基础全套连载关注专栏从零学Java稳步进阶后端开发