news 2026/5/1 11:17:48

深度剖析Java高并发:从线程池到CAS原理,阿里面试必问系列

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
深度剖析Java高并发:从线程池到CAS原理,阿里面试必问系列

引言

高并发是Java后端开发的核心能力,也是大厂面试的重灾区。本文将从线程池核心原理、CAS无锁机制、Synchronized优化、JUC并发工具类四个维度,深入剖析Java高并发的底层逻辑。


一、线程池核心原理

1.1 线程池为什么要用

直接创建线程的问题:

// 每次请求都创建新线程for(inti=0;i<1000;i++){newThread(()->{// 业务逻辑}).start();}

问题:

  • 线程创建和销毁开销大
  • 大量线程竞争CPU资源
  • 线程数量不可控

1.2 线程池工作原理

// 线程池核心参数publicThreadPoolExecutor(intcorePoolSize,// 核心线程数intmaximumPoolSize,// 最大线程数longkeepAliveTime,// 空闲线程存活时间TimeUnitunit,// 时间单位BlockingQueue<Runnable>workQueue,// 任务队列ThreadFactorythreadFactory,// 线程工厂RejectedExecutionHandlerhandler// 拒绝策略)

线程池执行流程:

任务进来 ↓ corePoolSize未满?→ 创建核心线程执行 ↓ (是) 核心线程满了吗? ↓ (否) workQueue未满?→ 任务加入队列等待 ↓ (是) maximumPoolSize未满?→ 创建临时线程执行 ↓ (是) 执行拒绝策略

1.3 七大参数详解

参数含义设置建议
corePoolSize核心线程数CPU密集型:CPU核数+1;IO密集型:CPU核数×2
maximumPoolSize最大线程数corePoolSize × 2
keepAliveTime空闲存活时间默认10ms
workQueue任务队列LinkedBlockingQueue/SynchronousQueue
threadFactory线程工厂自定义线程名便于排查
handler拒绝策略AbortPolicy/CallerRunsPolicy

1.4 阿里面试题:线程池大小怎么设置?

// CPU密集型任务intcorePoolSize=Runtime.getRuntime().availableProcessors()+1;// IO密集型任务(经验公式)intcorePoolSize=Runtime.getRuntime().availableProcessors()*2;// 或者更精确的计算intcorePoolSize=Runtime.getRuntime().availableProcessors()/(1-阻塞系数)// 阻塞系数通常取0.8~0.9

二、CAS无锁机制

2.1 CAS是什么

CAS(Compare And Swap)是一种无锁算法,它包含三个操作数:

  • 内存位置 V
  • 预期原值 A
  • 新值 B
// CAS语义:只有当V的值等于A时,才用B去更新V// 否则什么都不做,返回V当前值

2.2 Java中CAS的实现

// AtomicInteger源码分析publicclassAtomicIntegerextendsNumber{privatestaticfinallongserialVersionUID=...;// 使用Unsafe类的CAS操作privatevolatileintvalue;publicfinalbooleancompareAndSwap(intexpectedValue,intnewValue){returnunsafe.compareAndSwapInt(this,valueOffset,expectedValue,newValue);}// 乐观锁实现publicfinalintincrementAndGet(){for(;;){intcurrent=get();intnext=current+1;if(compareAndSwap(current,next)){returnnext;}}}}

2.3 CAS的三大问题

问题1:ABA问题

// 线程1读取A,线程2将A改成B又改回A,线程1的CAS仍会成功// 解决:使用AtomicStampedReference增加版本号AtomicStampedReference<Integer>ref=newAtomicStampedReference<>(1,0);ref.compareAndSet(1,2,0,1);// 带版本号的CAS

问题2:自旋开销大

// 如果CAS失败,会一直自旋,消耗CPU// 解决:限制自旋次数,或使用LongAdderLongAddercounter=newLongAdder();counter.increment();// 分散热点,优于AtomicLong

问题3:只能保证一个变量原子性

// 多个变量需要原子操作怎么办?// 解决:使用AtomicReferenceAtomicReference<User>userRef=newAtomicReference<>();userRef.compareAndSet(oldUser,newUser);

三、Synchronized优化

3.1 synchronized锁升级路径

无锁 → 偏向锁 → 轻量级锁 → 重量级锁
锁类型场景升级条件
偏向锁单线程访问无竞争
轻量级锁多线程轻度竞争短时间自旋
重量级锁多线程激烈竞争自旋超过阈值

3.2 锁消除

publicvoidmethod(){// JIT编译时发现这个StringBuffer不会逃逸出方法外// 消除synchronized,直接拼接StringBuffersb=newStringBuffer();sb.append("a").append("b");// 实际上没有锁的开销}

3.3 锁粗化

// 连续加锁操作JIT会合并StringBuffersb=newStringBuffer();synchronized(sb){sb.append("a");}synchronized(sb){sb.append("b");}// JIT优化为:synchronized(sb){sb.append("a");sb.append("b");}

四、JUC并发工具类

4.1 CountDownLatch门闩

// 场景:等待多个线程执行完毕再执行主线程CountDownLatchlatch=newCountDownLatch(3);newThread(()->{// 任务1latch.countDown();}).start();newThread(()->{// 任务2latch.countDown();}).start();latch.await();// 阻塞直到countDown()被调用3次System.out.println("所有任务完成");

4.2 CyclicBarrier循环栅栏

// 场景:多个线程互相等待,全部到达后再执行CyclicBarrierbarrier=newCyclicBarrier(3,()->{System.out.println("所有人都到了,开始执行任务");});for(inti=0;i<3;i++){newThread(()->{// 准备任务barrier.await();// 等待其他人// 执行任务}).start();}

4.3 Semaphore信号量

// 场景:控制同时访问资源的线程数Semaphoresemaphore=newSemaphore(3);for(inti=0;i<10;i++){newThread(()->{try{semaphore.acquire();// 获取许可证// 访问共享资源(数据库连接池等)semaphore.release();// 释放许可证}catch(InterruptedExceptione){e.printStackTrace();}}).start();}

总结

知识点面试重点
线程池7大参数、执行流程、拒绝策略
CAS原理、ABA问题、LongAdder
Synchronized锁升级、锁消除、锁粗化
JUC工具CountDownLatch/CyclicBarrier/Semaphore

核心口诀:线程池控资源,CAS乐观无阻塞,Synchronized看升级,JUC工具解并发。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/1 10:01:34

ARM SVE指令集:可扩展向量计算与位操作优化

1. SVE指令集架构概述SVE&#xff08;Scalable Vector Extension&#xff09;是ARMv8-A架构引入的可扩展向量指令集扩展&#xff0c;它突破了传统SIMD指令集固定位宽的限制。与NEON指令集不同&#xff0c;SVE允许实现支持128b到2048b之间的任意向量长度&#xff0c;且同一二进制…

作者头像 李华
网站建设 2026/4/27 11:14:00

视频下载 API—AI 驱动的企业级视频数据采集下载全栈解决方案

Dataify的视频数据已成为企业核心生产资料的数字化时代&#xff0c;Dataify 视频下载API依托AI 智能解析引擎与合规化数据采集技术体系&#xff0c;应对传统视频采集的格式壁垒、地域管理、效率瓶颈与数据价值挖掘等难题&#xff0c;以全链路技术实现音视频资源的高效获取、批量…

作者头像 李华
网站建设 2026/4/25 22:02:03

LIN网络诊断与配置实战:如何用Raw API和Cooked API搞定汽车ECU的‘身份识别’与‘远程升级’?

LIN网络诊断与配置实战&#xff1a;Raw API与Cooked API在汽车ECU开发中的深度应用 当一辆新车驶入4S店售后工位&#xff0c;技师连接诊断仪准备刷写车门模块参数时&#xff0c;背后是LIN总线上的数据流在默默完成身份校验、版本读取和配置更新的复杂对话。这种看似简单的底层操…

作者头像 李华