尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
Java 锁相关 面试知识
1. 引言锁是 Java 并发编程的核心也是面试中几乎必考的高频话题。面试官往往从「什么是锁」开始层层深入问到synchronized的锁升级、AQS 原理、ReentrantLock的实现等底层细节。本文整理了一批 Java 锁相关的高频面试题并给出由浅入深的参考答案帮助你在面试中从容应对。2. 基础概念类面试题2.1 什么是悲观锁和乐观锁Java 中分别如何实现悲观锁假设并发冲突一定会发生操作数据前先加锁阻塞其他线程。Java 中的synchronized、Lock都是悲观锁。乐观锁假设冲突很少发生不加锁更新时通过版本号或 CAS 校验是否被修改冲突则重试。Java 中的AtomicInteger、LongAdder基于 CAS 实现乐观锁。// 乐观锁CAS 自增AtomicIntegercountnewAtomicInteger(0);count.incrementAndGet();2.2 什么是公平锁和非公平锁区别是什么公平锁按线程请求锁的顺序FIFO依次获取先来先服务避免饥饿但吞吐量较低。非公平锁线程可以「插队」直接尝试获取锁吞吐量更高但可能造成某些线程长期得不到锁饥饿。ReentrantLock默认非公平可通过构造参数指定ReentrantLockfairLocknewReentrantLock(true);// 公平锁ReentrantLockunfairLocknewReentrantLock(false);// 非公平锁默认2.3 什么是可重入锁为什么需要可重入可重入锁递归锁指同一个线程可以多次获取同一把锁而不会死锁。synchronized和ReentrantLock都是可重入锁。可重入避免了同一线程在递归调用或嵌套调用时因重复加锁而自我死锁。publicsynchronizedvoidmethodA(){methodB();// 同一线程再次获取锁不会死锁}publicsynchronizedvoidmethodB(){}2.4 什么是共享锁和独占锁独占锁排他锁同一时刻只能被一个线程持有如synchronized、ReentrantLock、读写锁中的写锁。共享锁同一时刻可被多个线程同时持有如ReentrantReadWriteLock中的读锁。面试追问追问乐观锁在并发冲突频繁时性能如何答冲突频繁时 CAS 会大量自旋重试CPU 开销大性能反而下降此时悲观锁更合适。追问CAS 存在哪些问题答ABA 问题可用版本号解决、自旋开销大、只能保证单个变量的原子性。追问公平锁一定比非公平锁好吗答不一定。公平锁避免饥饿但吞吐量低非公平锁吞吐量高但可能造成线程饥饿需按场景权衡。3. synchronized 高频面试题3.1 synchronized 的三种用法分别锁的是什么修饰实例方法锁是当前实例对象this。修饰静态方法锁是当前类的Class对象。修饰代码块锁是括号内指定的对象。publicclassSyncDemo{publicsynchronizedvoidinstanceMethod(){}// 锁thispublicstaticsynchronizedvoidstaticMethod(){}// 锁Class 对象publicvoidblockMethod(){synchronized(this){}// 锁指定对象}}3.2 synchronized 的锁升级过程是怎样的JDK 1.6 之后synchronized引入锁升级机制从低到高单向升级无锁没有竞争直接访问。偏向锁只有一个线程访问时记录线程 ID减少 CAS 开销。轻量级锁多个线程交替访问时通过 CAS 自旋获取锁。重量级锁竞争激烈时升级为依赖操作系统互斥量的重量级锁未获取锁的线程被阻塞。锁升级是单向的只能从低到高不能降级。之所以不允许降级是因为锁状态一旦升级其内部结构如轻量级锁的栈帧记录、重量级锁的 Monitor 对象已经建立若再降级需要额外的状态转换和清理逻辑会带来无意义的开销与实现复杂性且收益甚微——竞争一旦激烈短期内大概率还会再次升级反复升降只会徒增性能损耗。在 HotSpot 实现中偏向锁存在**撤销revoke与重偏向rebias**机制当第二个线程访问同一对象时偏向锁会被撤销并升级为轻量级锁而当偏向锁被撤销后若该对象再次被某个线程独占访问JVM 会通过批量重偏向bulk rebias让锁重新进入偏向状态从而减少不必要的锁升级。不过随着 JDK 15 起偏向锁被默认禁用并逐步废弃这一机制在现代 JVM 中已逐渐淡出。3.3 synchronized 和 Lock 有什么区别对比项synchronizedLock实现方式JVM 关键字Java 接口如 ReentrantLock锁的释放自动释放需手动 unlock()可中断否支持 lockInterruptibly()公平性非公平可配置公平/非公平多个条件不支持支持多个 Condition性能锁升级后接近 Lock高并发下更灵活面试追问追问偏向锁在 JDK 15 之后为什么被废弃答偏向锁的撤销需要 STWStop-The-World在竞争不激烈的现代应用收益有限且维护成本高JDK 15 起默认禁用并逐步废弃。追问锁升级过程中出现竞争会怎样答轻量级锁 CAS 自旋失败后会膨胀升级为重量级锁未获取锁的线程进入阻塞状态由操作系统调度。追问synchronized 锁的是对象还是代码答锁的是对象监视器 Monitor代码只是被锁保护的临界区。4. Lock 与 AQS 面试题4.1 ReentrantLock 是如何实现可重入的ReentrantLock基于 AQS 实现内部通过state变量记录锁的持有次数state 0锁未被持有。state 0锁被持有数值表示重入次数。获取锁时通过 CAS 将state从 0 改为 1重入时state加 1释放时state减 1减到 0 才真正释放锁。4.2 AQS 是什么它的核心组成有哪些AQSAbstractQueuedSynchronizer是 JUC 包中锁和同步器的底层框架ReentrantLock、Semaphore、CountDownLatch、ReentrantReadWriteLock等都基于它实现。核心组成state 变量用volatile修饰表示同步状态。CLH 队列一个 FIFO 双向队列存放等待获取锁的线程。CAS 操作用于原子地修改state。4.3 AQS 获取锁的流程是怎样的是否线程尝试获取锁CAS 修改 state 成功?获取锁成功执行业务线程封装为 Node 加入 CLH 队列阻塞等待前驱节点释放锁后唤醒4.4 基于 AQS 实现的同步器有哪些ReentrantLock独占锁。Semaphore信号量控制同时访问的线程数。CountDownLatch倒计时门闩等待多个线程完成。CyclicBarrier循环屏障多个线程互相等待。ReentrantReadWriteLock读写锁。面试追问追问AQS 的 CLH 队列为什么是双向队列答双向队列便于在释放锁时从尾部向前查找可唤醒的后继节点也支持取消等待时快速出队避免单向队列的遍历开销。追问state 为什么用 volatile 修饰答保证多线程对 state 的修改对其他线程立即可见配合 CAS 实现原子更新确保锁状态的一致性。追问ReentrantLock 的公平锁和非公平锁在 AQS 中如何体现答公平锁在 tryAcquire 时会先检查队列中是否有前驱节点有则排队非公平锁直接尝试 CAS 抢占失败才入队。5. 读写锁与进阶工具面试题5.1 读写锁适用于什么场景为什么读锁是共享的读写锁适用于读多写少的场景如缓存、配置信息等。读操作不会修改数据多个线程同时读是安全的因此读锁共享锁可被多个线程同时持有而写操作会修改数据写锁独占锁与读锁、写锁都互斥保证数据一致性。ReentrantReadWriteLockrwLocknewReentrantReadWriteLock();LockreadLockrwLock.readLock();LockwriteLockrwLock.writeLock();readLock.lock();try{// 读共享数据}finally{readLock.unlock();}writeLock.lock();try{// 写共享数据}finally{writeLock.unlock();}5.2 StampedLock 相比读写锁有什么优势StampedLock是 JDK 1.8 引入的支持三种模式写锁、读锁、乐观读。乐观读不阻塞写线程在读多写少且对一致性要求不高的场景下性能更高。但乐观读需要在校验失败时升级为悲观读锁。StampedLockstampedLocknewStampedLock();longstampstampedLock.tryOptimisticRead();// 乐观读// 读取数据if(!stampedLock.validate(stamp)){stampstampedLock.readLock();// 校验失败升级为悲观读锁try{// 重新读取}finally{stampedLock.unlockRead(stamp);}}5.3 Condition 和 Object 的 wait/notify 有什么区别Condition是Lock的等待/通知机制类似于Object的wait()/notify()但更灵活一个Lock可以绑定多个Condition实现更精细的等待/通知控制。Condition支持可中断等待和超时等待。必须与Lock配合使用在lock()之后、unlock()之前调用。LocklocknewReentrantLock();ConditionnotEmptylock.newCondition();ConditionnotFulllock.newCondition();lock.lock();try{while(queue.isEmpty()){notEmpty.await();// 等待}notFull.signalAll();// 通知}finally{lock.unlock();}面试追问追问读写锁为什么会出现写饥饿如何解决答读锁可被多个线程持有若读线程持续进入写线程可能长期等待。可通过公平模式或StampedLock的乐观读缓解。追问StampedLock 的乐观读一定比悲观读快吗答不一定。乐观读省去了加锁开销但校验失败后需重读或升级为悲观读在写频繁场景下反而更慢。追问Condition 的 await 和 Object 的 wait 有什么区别答Condition.await()支持超时和可中断且一个 Lock 可绑定多个 Condition 实现精细控制wait()只能配合synchronized使用。6. 锁的性能优化面试题6.1 如何减少锁竞争、提升并发性能尽量缩小锁的粒度减少锁持有时间。优先使用synchronized必要时才用Lock。读多写少用读写锁或StampedLock。避免在锁内执行耗时操作如 IO、网络请求。使用volatile、Atomic类替代部分加锁场景。使用ConcurrentHashMap等并发容器替代手动加锁。6.2 volatile 和 synchronized 有什么区别volatile保证可见性和有序性但不保证原子性synchronized三者都保证。volatile不能修饰方法只能修饰变量synchronized可修饰方法、代码块。volatile不会阻塞线程性能开销更小synchronized可能引起线程阻塞。6.4 锁对比总结表对比项synchronizedReentrantLockReentrantReadWriteLockStampedLock锁类型悲观锁、独占锁悲观锁、独占锁读锁共享、写锁独占写锁独占、读锁共享、乐观读可重入支持支持支持不支持公平性非公平可配置公平/非公平可配置公平/非公平非公平中断支持不支持支持 lockInterruptibly()支持不支持条件等待仅 wait/notify支持多个 Condition支持多个 Condition不支持适用场景简单同步、锁竞争不激烈需要中断、超时、公平锁的复杂场景读多写少、缓存等场景读多写少且对一致性要求不高、追求极致性能选型建议默认优先使用synchronized代码简洁且锁升级后性能接近Lock需要可中断、超时等待、公平锁或多个条件队列时改用ReentrantLock读多写少的场景用ReentrantReadWriteLock提升并发读吞吐对一致性要求不高且追求极致读性能时可考虑StampedLock的乐观读但要注意它不可重入且不支持条件等待。7. 总结Java 锁面试题的核心脉络是从锁的基本分类乐观/悲观、公平/非公平、可重入、共享/独占到synchronized的用法与锁升级再到Lock接口与 AQS 底层原理最后延伸到读写锁、StampedLock、Condition等进阶工具。面试时建议结合源码如ReentrantLock、AQS和实际项目经验来回答展现深度与实战能力。
RELATED

相关推荐

如何用Lenovo Legion Toolkit平衡续航与性能:混合模式与独显管理完全教程

如何用Lenovo Legion Toolkit平衡续航与性能:混合模式与独显管理完全教程

如何用Lenovo Legion Toolkit平衡续航与性能:混合模式与独显管理完全教程 【免费下载链接】LenovoLegionToolkit Lenovo Legion Toolkit (LLT) is a Windows desktop utility created for Lenovo gaming laptops that replaces Lenovo Vantage, Legion Zone, and Le…

📅 2026/10/8 7:10:17
AI产品出海实录03:提交App之前一定要看,我用5次被拒换来的自查清单

AI产品出海实录03:提交App之前一定要看,我用5次被拒换来的自查清单

第一篇里我留了个坑:iOS版本被打回了很多次,具体怎么回事以后单独写。今天来填。先交个底。第一个App头一回提交App Store,4天被打回3次,每次理由还都不一样,加起来5条。第二个App更狠,第一次交上去就被归到…

📅 2026/10/8 7:05:17
桥架、灯具、配电图,两款国产CAD横向比一比

桥架、灯具、配电图,两款国产CAD横向比一比

做电气设计,最考验人的往往不是系统图本身,而是那些又细又密的活儿。一栋高层的照明、插座、弱电点位动辄成百上千,要在不同楼层、不同户型间反复统计、编号、替换;强电桥架和弱电桥架在密集区域要避让协调,和暖通风管…

📅 2026/10/8 7:05:17
MORE NEWS

更多资讯

📰

n8n实战指南:AI原生混合编程自动化平台核心能力与部署解析

1. n8n 项目概述:为什么说它是“AI 原生的混合编程自动化平台”做自动化工具这个领域,我前前后后接触了不少。早些年用的是 Zapier,后来换过 Make(当时还叫 Integromat),再往后自己折腾过 Huginn、Node-RED…

📰

Linux SNMP监控与snmp++精简实践:从协议原理到采集器开发

简介:面向Linux网络管理与嵌入式开发者的SNMP精简实现源码包,主要解决资源受限环境下快速部署、学习或二次开发SNMP协议栈的迫切需求。压缩包共6个C语言源码文件,总大小仅39KB,代码结构紧凑,涵盖ASN.1编解码、MIB信息结…

📰

基于YOLO的深度学习头盔佩戴检测系统:从数据集到PyQt5部署全流程

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

DIC全场动态监测:薄板焊接变形控制的关键技术

1. 薄板焊接变形:一场收益极高的“工艺攻坚战”薄板焊接变形,是焊接工程师绕不开的老大难。车身覆盖件、电池托盘、精密箱体、船用薄板分段,凡是板厚在0.8mm到3mm这个区间,焊完一测,平面度超差、角变形翘起、波浪变形起…

📰

无人机集群分布式估计:事件触发与量化通信的EKF仿真对比

1. 为什么拿集中式EKF当标尺:分布式估计的通信代价从哪来无人机集群协同最核心的瓶颈其实不是算力,而是通信。你想想看,每架无人机都在用机载传感器(惯导、GPS、视觉、雷达)感知周围环境,但这些传感器数据如…

📰

事件委托实战:用单个监听器为消息列表实现 [x] 关闭按钮

文档教程前端 【免费下载链接】zh.javascript.info 现代 JavaScript 教程(The Modern JavaScript Tutorial),以最新的 ECMAScript 规范为基准,通过简单但足够详细的内容,为你讲解从基础到高阶的 JavaScript 相关知识。…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬