版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
JavaAQS高频面试题及详细答案(真实面试版)一、基础概念类(入门必问)1.什么是AQS?它的作用是什么?AQS全称AbstractQueuedSynchronizer,是Java并发包(JUC)中用于构建锁和同步器的底层抽象框架,位于java.util.concurrent.locks包下。简单来说,JUC里大部分常用锁和同步工具,比如ReentrantLock、ReentrantReadWriteLock、CountDownLatch、Semaphore、CyclicBarrier,底层都是基于AQS实现的。AQS核心作用:统一管理线程的获取锁、释放锁、线程阻塞、线程唤醒、排队等待逻辑,让开发者不用重复实现同步排队、阻塞唤醒的底层逻辑,只需要重写少量核心方法,就能快速实现自定义同步器。2.AQS的核心设计思想是什么?AQS整体就三件核心设计,非常好记:1)state同步状态变量:用一个volatile修饰的int变量state,记录锁的状态。0代表无锁、大于0代表有锁/有资源被占用,不同同步器对state的解读不一样。2)CLH双向阻塞队列:抢锁失败的线程,会被封装成节点放入队列尾部排队,线程进入阻塞状态;锁释放后,会从队列头部依次唤醒线程抢锁。3)模板方法模式:AQS把排队、阻塞、唤醒、CAS重试的通用逻辑全部封装好,只暴露少量需要子类重写的抽象方法,由子类定义加锁和释放锁的具体规则。3.AQS的state变量有什么意义?不同组件中state代表什么?state是AQS的核心同步标识,volatileint保证可见性,通过CAS保证修改的原子性,不同同步工具对state的定义不同:-ReentrantLock:state=0无锁,state>0表示已加锁,数值代表重入次数-ReentrantReadWriteLock:高16位为读锁状态,低16位为写锁状态-CountDownLatch:state表示剩余倒数次数-Semaphore:state表示剩余可用资源令牌数二、核心原理类(面试重点)4.简单说一下AQS抢锁和释放锁的完整流程抢锁流程:1.线程尝试通过CAS修改state变量,尝试直接获取锁;2.抢锁成功,直接执行业务逻辑;3.抢锁失败,将当前线程封装成Node节点,加入CLH队列尾部;4.进入自旋重试逻辑,再次尝试抢锁;5.多次重试失败后,线程通过LockSupport.park()阻塞,等待被唤醒。释放锁流程:1.当前线程修改state状态,释放锁资源;2.修改成功后,从CLH队列头部唤醒下一个等待线程;3.被唤醒的线程继续自旋尝试抢锁,抢到锁后继续执行。5.AQS的CLH队列是什么?节点Node包含哪些核心属性?CLH是AQS内部的双向阻塞队列,是一个虚拟队列,没有真实的队列对象,仅通过Node节点的prev、next指针关联,用来存储所有抢锁失败的阻塞线程。Node核心属性:-thread:当前封装的等待线程-prev:前驱节点指针-next:后继节点指针-waitStatus:节点等待状态,控制线程阻塞和唤醒其中waitStatus是关键,常用状态:-0:初始状态--1(SIGNAL):后继节点需要被唤醒--2(CONDITION):节点在条件队列等待--3(PROPAGATE):共享锁状态传播-1(CANCELLED):线程取消等待、超时或中断,节点失效6.AQS为什么要使用双向队列?单向队列不行吗?不行,双向队列是AQS容错机制的关键,核心原因有两点:1)处理节点失效问题:队列中部分节点可能因为超时、中断被取消(状态改为1),双向队列可以通过prev指针向前遍历,快速跳过失效节点,找到有效前驱节点,保证队列正常唤醒。2)自旋校验依赖前驱节点:AQS线程自旋抢锁时,需要判断前驱节点是否是头节点,以此决定是否尝试抢锁,双向指针可以精准定位前驱节点状态。7.AQS独占锁和共享锁的区别是什么?AQS内置两种锁模式,适配不同并发场景:独占锁(Exclusive)-同一时刻只能有一个线程获取锁-锁释放时,只唤醒队列中下一个等待线程-对应实现:ReentrantLock-核心方法:tryAcquire、tryRelease共享锁(Shared)-同一时刻可以多个线程同时获取锁(资源)-锁释放时,会传播唤醒后续所有可获取资源的线程-对应实现:Semaphore、CountDownLatch、读写锁的读锁-核心方法:tryAcquireShared、tryReleaseShared三、源码细节高频题(进阶面试)8.AQS为什么需要自旋+park阻塞?为什么不一直自旋?这是AQS优化并发性能的核心设计,单纯自旋和单纯阻塞都有问题:1)一直自旋的问题:线程空转循环,会持续占用CPU资源,高并发下大量线程自旋会导致CPU飙升,资源浪费严重。2)直接阻塞的问题:线程从运行态切换到阻塞态需要操作系统内核切换,开销很大。如果锁很快就释放,直接阻塞再唤醒的成本远高于短暂自旋。最终方案:自旋重试+阻塞兜底线程抢锁失败后,先进行有限次数的自旋重试,如果还是抢不到锁,再调用park阻塞,既减少了上下文切换开销,又避免了CPU空转浪费。9.AQS队列中的头节点为什么是虚拟节点?AQS的队列头节点(head)默认是空节点,不绑定任何业务线程,核心目的是统一唤醒逻辑、简化边界判断。如果没有虚拟头节点,第一个入队的线程节点没有前驱节点,唤醒、状态判断、CAS操作都需要单独处理边界逻辑。有了虚拟头节点后,所有等待线程节点都有统一的前驱节点,唤醒时只需要固定唤醒head的后继节点,逻辑统一,减少大量if/else边界判断,代码更稳定。10.说一下AQS可中断锁和不可中断锁的区别1)不可中断锁(acquire)线程进入队列阻塞后,忽略中断信号。就算线程被调用interrupt,也不会停止抢锁,只会记录中断状态,直到抢到锁执行完毕后,再响应中断。ReentrantLock的lock()方法就是不可中断锁。2)可中断锁(acquireInterruptibly)线程阻塞过程中,如果检测到中断信号,会直接抛出InterruptedException,终止抢锁流程,退出队列。可以避免线程一直阻塞死等。11.AQS锁超时机制是怎么实现的?AQS的tryAcquireNanos方法支持超时抢锁,核心逻辑:1.记录开始抢锁的时间;2.每次自旋时判断剩余超时时间;3.如果剩余时间不足,直接取消抢锁,节点标记为取消状态,退出队列;4.如果超时时间充足,继续自旋或阻塞。ReentrantLock.tryLock(longtimeout,TimeUnitunit)就是基于该机制实现。四、对比与坑点面试题(压轴高频)12.AQS和synchronized的区别?1)实现层面:synchronized是JVM底层原生实现,依赖对象头、监视器锁;AQS是Java代码层面实现的同步框架。2)功能灵活性:synchronized功能固定,只支持独占锁、不可超时、不可中断;AQS支持独占/共享锁、可中断、可超时、公平/非公平锁、读写锁等丰富功能。3)队列机制:synchronized等待队列是JVM维护,开发者无法干预;AQS队列由Java代码维护,逻辑透明,可自定义扩展。4)性能:JDK1.6后synchronized做了偏向锁、轻量级锁、重量级锁优化,性能大幅提升,低并发下两者差距不大;高并发、复杂同步场景下AQS灵活性更强。13.公平锁和非公平锁在AQS中是怎么实现的?非公平锁(默认)线程进来后,先直接CAS抢锁,不管队列里有没有等待线程,抢到就直接执行,抢不到再入队。优点是吞吐量高,减少线程切换;缺点是可能出现队列线程饥饿。公平锁线程进来后,先判断队列是否有等待线程,如果有,直接入队排队,不会插队抢锁。保证线程先来先服务,无饥饿问题,但吞吐量更低,自旋和阻塞开销更大。14.AQS为什么不会出现线程死锁?AQS本身不产生死锁,死锁是业务代码的问题。AQS自身机制可以规避内部死锁:1)队列是单向唤醒、顺序排队,不会出现循环等待的线程依赖;2)节点支持超时、中断取消,阻塞线程可以主动退出等待,不会永久阻塞;3)失效节点会被自动清理,不会阻塞队列唤醒流程。15.什么是锁重入?AQS怎么支持可重入锁?锁重入指同一个线程可以多次获取同一把锁,避免自己锁死自己。AQS实现重入的核心逻辑(ReentrantLock):1.抢锁时先判断当前持有锁的线程是否是自身;2.如果是自身,state状态值+1,直接加锁成功;3.释放锁时state依次减1,直到state为0,才真正释放锁。五、总结问答(面试收尾必背)16.你日常开发中,哪些工具类底层用到了AQS?这个问题直接按场景回答即可:-独占锁:ReentrantLock-读写锁
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 国家公务员考试行测试题库
- 2026年深圳市水务集团有限公司校园招聘笔试备考题库及答案解析
- 2026年航天科技集团计算机通信专业招聘卷及答案
- 2026年小微企业消防安全政策考试题及答案
- 2027年考研法硕专业基础预测试卷
- 2026年靶向治疗不良反应护理监测行动计划
- 2026年巴中市恩阳区网格员面试题库及答案
- 2026年安全生产工作计划及思路
- 闽教版初中七年级心理健康教育《体验友情》教学设计
- 高中地理高二选择性必修3《全球气候变化与国家安全》教学设计
- 2025浙江鹿城农商银行春季招聘笔试历年典型考题及考点剖析附带答案详解
- 2026年熔化焊接与热切割作业考试题库及模拟考试附答案
- 2026国家电投集团所属国家核电招聘(41人)笔试历年典型考点题库附带答案详解
- 2025年高考全国卷理科综合真题完整版(含标准答案+详细解析)
- 留置看护辅警考试面试真题(附答案)
- 服装企业面料采购质量控制方案
- 智慧城市重大危险源在线监控及事故预警平台规划方案
- 单县羊肉汤介绍
- 医务人员院感考试试题及答案
- 2025四川绵阳市绵投置地有限公司人力资源岗等岗位拟录用人选笔试历年参考题库附带答案详解
- TCTSS 3-2024 茶艺职业技能竞赛技术规程
评论
0/150
提交评论