版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Java锁机制高频面试题及详细参考答案(完整版)说明:本套试题整理互联网大厂Java后端面试高频锁相关考题,涵盖基础锁、乐观锁悲观锁、内置锁、显式锁、并发锁进阶知识点,题型包含基础问答、对比分析、原理简答、场景实操,答案贴合一线面试答题标准,通俗易懂、侧重原理和实战,适合面试复盘、技术自测、知识点巩固。一、基础概念面试题(必考)1.简述什么是线程锁?Java中锁的核心作用是什么?参考答案:线程锁是Java并发编程中用于控制多线程访问共享资源的同步机制。多线程环境下,多个线程同时读写共享变量会出现数据不一致、脏数据、线程安全问题,锁的核心作用就是保证共享资源的原子性、可见性、有序性。简单来说,锁可以实现同一时刻只允许一个线程执行临界区代码,避免多线程竞争导致的并发异常,保障并发程序的稳定运行。2.什么是乐观锁和悲观锁?二者核心区别是什么?日常使用场景有哪些?参考答案:悲观锁:默认认为并发竞争一定会发生,每次操作共享资源都会直接加锁,阻塞其他等待线程,直到当前线程释放锁资源,属于独占式锁。典型特点是加锁开销大、并发性能低,但数据安全性极高。乐观锁:默认认为并发竞争很少发生,操作资源时不加锁,仅在数据提交更新时校验数据是否被其他线程修改。如果数据未被修改则正常更新,若已被修改则放弃本次操作或重试,无阻塞、并发性能高。核心区别:悲观锁主动加锁阻塞线程,乐观锁无锁、依靠版本校验实现并发控制;悲观锁适合高并发竞争场景,乐观锁适合读多写少场景。使用场景:悲观锁:synchronized、ReentrantLock、数据库forupdate行锁,适用于写操作频繁、竞争激烈的场景。乐观锁:CAS机制、数据库版本号控制,适用于接口查询多、修改少的高并发场景。3.简述CAS的原理、优缺点以及存在的问题参考答案:CAS全称比较并交换,是乐观锁的核心实现机制,底层基于Unsafe类的native方法实现,包含三个核心参数:内存值V、预期旧值A、更新新值B。执行逻辑:当且仅当内存值V等于预期旧值A时,才将内存值更新为B;如果不相等,说明数据已被其他线程修改,本次更新失败,通常会自旋重试。优点:无锁操作,不会产生线程阻塞,减少了线程切换开销,并发执行效率远高于悲观锁。缺点及存在问题:1.自旋重试消耗CPU资源,如果并发冲突频繁,会导致线程一直循环重试,占用大量CPU。2.存在ABA问题:线程读取数据为A,其他线程先将A修改为B,再改回A,当前线程CAS校验时无法感知数据发生过变动,导致更新逻辑出错。3.只能保证单个变量的原子性,无法保证一段代码、多个变量操作的原子性。二、synchronized内置锁高频面试题1.简述synchronized的作用、使用方式以及锁对象区别参考答案:synchronized是Java原生内置锁,属于悲观锁、独占锁、可重入锁,能够保证修饰代码块或方法的原子性、可见性、有序性,是解决线程安全问题最基础的方式。三种使用方式及锁对象:1.修饰实例方法:锁对象为当前实例对象this,不同实例之间互不影响,仅同一实例的同步方法互斥。2.修饰静态方法:锁对象为当前类的Class对象,所有该类的实例对象共享同一把锁,静态同步方法全局互斥。3.修饰代码块:可自定义锁对象(任意Object对象),粒度更细,只锁定核心临界代码,性能优于直接修饰方法。2.synchronized是可重入锁吗?什么是锁重入?有什么作用?参考答案:synchronized是可重入锁。锁重入指同一个线程获取到锁之后,可以再次获取同一把锁,不会出现自己阻塞自己的情况。底层原理是JVM会为每个锁对象维护一个计数器,线程获取锁时计数器加1,释放锁时计数器减1,只有计数器归0时,锁才会完全释放。锁重入的核心作用是避免线程死锁。比如同步方法A内部调用同步方法B,同一线程无需重新竞争锁,可直接执行,简化了同步代码的编写逻辑。3.简述synchronized的锁升级机制(JDK1.6优化)参考答案:JDK1.6之前synchronized是重量级锁,性能较差;1.6之后引入锁升级机制,锁状态会根据并发竞争情况自动升级,顺序为:偏向锁→轻量级锁→重量级锁,锁只能升级不能降级。1.偏向锁:无竞争场景下默认开启,默认偏向第一个获取锁的线程,后续该线程再次获取锁无需任何竞争操作,开销极低,适用于单线程重复获取锁的场景。2.轻量级锁:当出现其他线程竞争锁时,偏向锁升级为轻量级锁。底层基于CAS自旋实现,线程不会阻塞,通过循环重试尝试获取锁,适用于竞争不激烈、锁持有时间短的场景。3.重量级锁:当自旋次数过多、或多个线程同时竞争锁,轻量级锁升级为重量级锁。此时未获取锁的线程会进入阻塞状态,等待锁释放后被唤醒,依托操作系统内核实现,开销最大,适用于高并发激烈竞争场景。三、ReentrantLock显式锁面试题1.ReentrantLock和synchronized的核心区别?实际开发如何选择?参考答案:核心区别:1.实现方式:synchronized是JVM底层原生实现,属于隐式锁;ReentrantLock是JDK代码层面实现的显式锁,需要手动加锁、释放锁。2.锁特性:synchronized只支持非公平锁;ReentrantLock支持公平锁和非公平锁两种模式。3.功能拓展:ReentrantLock可实现锁超时等待、可中断锁等待、条件变量精准唤醒线程,synchronized不具备这些拓展功能。4.锁粒度:二者均为可重入锁,但ReentrantLock粒度控制更灵活。5.异常释放:synchronized代码执行结束或异常时自动释放锁;ReentrantLock必须在finally代码块手动释放锁,否则会造成锁死、线程永久阻塞。开发选择原则:简单同步场景、代码量少、低并发场景优先使用synchronized,代码简洁无需手动释放锁,稳定性高。高并发场景、需要公平锁、锁超时、线程精准唤醒等特殊需求时,使用ReentrantLock。2.什么是公平锁和非公平锁?ReentrantLock如何实现公平锁?参考答案:公平锁:线程获取锁遵循先来先服务原则,按照线程请求锁的先后顺序排队获取,不会出现线程插队抢占锁的情况,线程执行有序,但整体吞吐量较低。非公平锁:线程获取锁时直接尝试抢占,不遵循排队顺序,可能出现后请求的线程先获取锁的情况,吞吐量更高、执行效率更快,但会存在线程饥饿问题。ReentrantLock默认是非公平锁,可通过有参构造方法newReentrantLock(true)开启公平锁模式。底层通过AQS队列实现,公平锁会先判断等待队列是否存在排队线程,有则进入队列等待;非公平锁直接尝试CAS抢占锁。3.ReentrantLock中lock()、tryLock()、lockInterruptibly()区别参考答案:1.lock():最常用加锁方法,阻塞式加锁。线程获取不到锁时会一直阻塞等待,无法被中断,直到获取锁成功,适合常规同步场景。2.tryLock():非阻塞尝试加锁,立即返回结果。能获取锁则返回true,无法获取直接返回false,线程不会阻塞,可用于避免长时间等待锁的场景。同时支持超时重载方法,指定时间内未获取锁则直接放弃。3.lockInterruptibly():可中断阻塞加锁。线程阻塞等待锁的过程中,可响应线程中断信号,抛出中断异常,适合需要主动终止等待线程的业务场景。四、AQS核心原理面试题1.简述AQS的核心作用和底层核心结构参考答案:AQS全称抽象队列同步器,是Java并发包中所有锁和同步工具的底层核心基础类,ReentrantLock、CountDownLatch、Semaphore等并发类底层均基于AQS实现。AQS核心作用是统一管理线程的锁获取、锁释放、线程阻塞、线程唤醒逻辑,简化并发同步工具的开发。底层两大核心结构:1.同步状态变量state:int类型变量,用于标记锁的状态。独占锁中state=0表示锁空闲,state>0表示锁已被占用(可重入时数值累加);共享锁中state表示剩余许可数量。2.FIFO双向阻塞队列:存储所有获取锁失败、进入阻塞状态的线程,当锁释放时,会从队列头部唤醒线程尝试获取锁。2.简述AQS独占锁的核心执行流程参考答案:1.线程尝试通过CAS修改state变量获取锁,若state修改成功,直接获取锁成功,执行业务代码。2.若CAS修改失败,说明锁被占用,当前线程封装为队列节点,加入AQS双向阻塞队列尾部。3.线程进入阻塞状态,停止抢占CPU资源,等待锁释放唤醒。4.持有锁的线程执行完毕,释放锁并修改state为0,同时唤醒队列头部的等待线程。5.被唤醒的线程再次尝试CAS抢占锁,抢占成功后出队执行业务逻辑,后续线程依次排队执行。五、锁进阶问题与实操面试题1.什么是死锁?产生死锁的四个必要条件?如何避免死锁?参考答案:死锁是指两个或多个线程互相持有对方需要的锁资源,同时互相等待对方释放锁,导致所有线程永久阻塞,程序卡死无法继续执行的并发问题。死锁四个必要条件(缺一不可):1.互斥条件:锁资源同一时刻只能被一个线程占用。2.请求与保持条件:线程已持有一把锁,同时请求获取另一把被占用的锁,不释放已有锁。3.不可剥夺条件:已被线程持有的锁,无法被其他线程强行抢占,只能主动释放。4.循环等待条件:多个线程之间形成锁资源循环等待的闭环。避免死锁方案:1.统一锁的获取顺序,所有线程按照固定顺序获取多把锁,打破循环等待条件。2.使用tryLock超时机制,线程等待锁超时后主动放弃,避免永久阻塞。3.减少锁嵌套,尽量避免一个线程同时持有多把锁。4.定时检测死锁线程,主动中断或重启线程。2.什么是锁自旋、锁消除、锁粗化?JVM如何优化锁性能?参考答案:1.锁自旋:轻量级锁优化方式,线程获取锁失败时不直接阻塞,循环自旋尝试获取锁,避免线程阻塞和唤醒的内核开销,适合锁持有时间短的场景。2.锁消除:JVM编译优化,对于不存在线程竞争的局部代码、无共享资源的同步代码,直接消除锁。比如方法内部创建的局部对象加锁,不存在多线程竞争,JVM会自动去除锁逻辑,提升执行效率。3.锁粗化:JVM将多次连续的加锁、解锁操作合并为一次,避免频繁加解锁的性能损耗。比如循环体内重复加解锁,会被优化为循环外一次加锁、一次解锁。3.读写锁ReentrantReadWriteLock的原理和使用场景参考答案:ReentrantReadWr
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年注册营养师(含技师题)对答案
- 2025汽车驾驶员(技师)考试题库与答案
- 2025一级消防工程师《技术实务》考试真题及答案解析
- 2025中医基础章节试题及答案
- 2026年《药品研发质量管理规范》专项训练试题(附答案)
- 2026年职业病诊断医师资格考试题库及完整答案
- 介入治疗在心血管疾病中的应用
- 2026下半年小学道法教资面试法律常识题库及答案
- 诊断学少尿无尿多尿学习
- 新生儿护理:过敏预防与饮食管理实操课件
- 2025年安徽省合肥市招聘社区工作者考试题(含答案)
- 《大学生创新创业法律实务》课件-单元六创新创业中的劳动法律制度
- 2026家长开学第一课主题班会课件
- 商业银行贷款业务全景讲解
- 露天煤矿安全技术措施培训课件
- 中考英语专练:短文语法填空(模拟10篇)
- 2026年机动车外检模拟试卷(含答案)
- 2025年滁州市融资担保集团有限公司公开招聘工作人员4笔试考点考试题库及答案
- 老年人疼痛管理与舒适护理技术
- 2026年小学科学知识竞赛练习题及答案
- 雨课堂学堂在线学堂云《国家安全概论(吉林)》单元测试考核答案
评论
0/150
提交评论