Java 同步机制高频面试题及详细答案(真实面试版)_第1页
Java 同步机制高频面试题及详细答案(真实面试版)_第2页
Java 同步机制高频面试题及详细答案(真实面试版)_第3页
Java 同步机制高频面试题及详细答案(真实面试版)_第4页
Java 同步机制高频面试题及详细答案(真实面试版)_第5页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Java同步机制高频面试题及详细答案(真实面试版)说明:本套题目整理自一线互联网及传统开发高频面试场景,覆盖synchronized、Lock、线程同步、锁升级、并发安全等核心知识点,答案贴合工程实践,摒弃书面化套话,适合面试复盘、技术自测、知识点巩固。一、基础概念面试题1.说一说你对Java线程同步的理解,为什么需要同步机制?参考答案:Java多线程场景下,多个线程同时操作共享资源,会出现数据覆盖、数据不一致的问题,这就是线程安全问题。而线程同步机制,核心作用就是保证共享资源在多线程并发访问时的原子性、可见性、有序性。简单来说,就是让多线程对共享资源的访问变成有序的,避免多个线程同时读写、修改同一数据,从而解决并发脏数据问题。像业务中的订单库存扣减、账户余额修改、集合并发操作,都必须依靠同步机制保证数据准确。2.并发编程中原子性、可见性、有序性分别是什么意思?参考答案原子性:一个操作或一组操作要么全部执行成功,要么全部不执行,执行过程中不会被其他线程打断。比如i++操作,本身是读取、计算、赋值三步,不做同步就会被拆分打断,导致数据错乱。可见性:一个线程修改了共享变量的值,其他线程能够立刻感知到最新值。Java中线程会将变量缓存到本地内存,不及时刷新的话,其他线程看不到最新修改结果,就会出现可见性问题。有序性:程序代码的执行顺序和编写顺序一致。CPU和编译器会做指令重排序优化,单线程下不影响结果,但多线程下重排序会导致逻辑混乱,有序性就是禁止不合理的指令重排。3.Java中实现线程同步的常见方式有哪些?参考答案:日常开发和面试中最常用的有四种,适用场景各有区别:1.synchronized关键字:JVM原生锁,自动加锁解锁,使用简单,适合常规并发同步场景;2.ReentrantLock可重入锁:JDK代码层面实现的锁,功能更丰富,支持超时锁、可中断锁、公平锁;3.volatile关键字:保证变量可见性和有序性,不保证原子性,适合状态标记类变量;4.并发工具类:CountDownLatch、CyclicBarrier、Semaphore,适合多线程协作、限流、批量任务场景。二、synchronized核心面试题4.synchronized的使用方式有几种?分别锁的是什么?参考答案:一共有三种使用方式,锁对象完全不同,这是面试高频考点:1.修饰普通方法:锁的是当前方法的实例对象(this),多个实例对象之间互不影响,只有同一实例的同步方法互斥;2.修饰静态方法:锁的是当前类的Class对象,属于全局锁,所有该类的实例对象都会被互斥,静态方法全局生效;3.修饰代码块:可以自定义锁对象,灵活性最高。可以锁this、锁Class对象,也可以锁自定义成员变量,精准控制同步范围,减少锁粒度,提升并发效率。5.synchronized是可重入锁吗?什么是锁重入?参考答案:synchronized是天然可重入锁,支持锁重入。锁重入的意思是:同一个线程已经获取到一把锁之后,在没有释放锁的前提下,可以再次获取同一把锁,不会出现自己阻塞自己的情况。比如一个同步方法内部调用了另一个同步方法,线程无需重新竞争锁,直接执行,这就是重入特性。如果不支持重入,这种嵌套调用会直接导致线程死锁。6.讲讲synchronized的锁升级机制(JDK1.6优化)参考答案:JDK1.6之后对synchronized做了大量优化,引入锁升级机制,锁状态从低到高依次升级,只能升级、不能降级,极大提升了性能:1.无锁状态:没有线程竞争锁,对象无锁标记;2.偏向锁:只有一个线程频繁获取锁,锁会偏向该线程,无需每次竞争,无CAS操作,性能极高;3.轻量级锁:出现少量线程交替竞争锁,没有阻塞,依靠CAS自旋尝试获取锁,避免线程阻塞开销;4.重量级锁:大量线程并发竞争锁,CAS自旋失败,线程进入阻塞状态,由操作系统调度,开销最大。日常低并发场景下,synchronized大多停留在偏向锁、轻量级锁状态,性能和Lock锁差距很小,高并发竞争激烈时会升级为重量级锁。7.synchronized会不会产生死锁?常见死锁场景是什么?参考答案:会产生死锁。synchronized只是保证同步,不会规避死锁问题。最常见的死锁场景:两个线程各自持有一把锁,同时尝试获取对方的锁,双方互相等待、互不释放,永久阻塞。比如线程A持有锁1,等待锁2;线程B持有锁2,等待锁1,就会形成死锁。死锁发生必须满足四个条件:互斥条件、请求保持条件、不可剥夺条件、循环等待条件,只要破坏其中一个就能避免死锁,开发中最常用的是统一锁的获取顺序。三、Lock锁与synchronized对比面试题8.ReentrantLock和synchronized的区别?参考答案:这是并发面试必考题,核心区别集中在功能、灵活性、底层实现:1.底层实现不同:synchronized是JVM底层原生实现,属于语法层面锁;ReentrantLock是JDK基于AQS队列同步器纯代码实现的锁。2.锁机制不同:synchronized只支持非公平锁;ReentrantLock同时支持公平锁和非公平锁,可手动指定。3.功能丰富度不同:ReentrantLock支持锁超时等待、可中断锁、条件队列精准唤醒;synchronized不支持超时,阻塞后只能被动等待,无法中断。4.锁释放方式不同:synchronized自动加锁、自动释放,无需手动处理;ReentrantLock需要手动lock()加锁、unlock()解锁,必须在finally中释放,避免死锁。5.性能差异:低并发下两者性能接近;高并发竞争激烈时,ReentrantLock性能更稳定。9.什么是公平锁和非公平锁?各自适用场景?参考答案公平锁:线程按照请求锁的先后顺序排队获取锁,先到先得,不会出现线程插队的情况,线程执行更均衡,但多了排队调度开销,吞吐量稍低。适合对响应公平性要求高的场景。非公平锁:线程获取锁不排队,新线程可以直接尝试抢占锁,成功率高,减少线程唤醒、切换的开销,吞吐量更高。但可能出现部分线程长期抢不到锁的饥饿问题。是日常开发默认使用的锁模式。10.ReentrantLock为什么要在finally中解锁?参考答案:ReentrantLock是手动锁,加锁成功后,如果业务代码出现异常、报错退出,不会自动释放锁。如果不在finally中解锁,锁会一直被当前线程持有,其他所有线程永久无法获取锁,直接导致程序卡死、业务阻塞,形成死锁。标准写法就是:try外lock加锁,try执行业务逻辑,finally中强制unlock解锁,保证锁一定释放。四、volatile同步面试题11.volatile关键字的作用是什么?能不能保证线程安全?参考答案:volatile核心两大作用:保证可见性、禁止指令重排序。它无法保证原子性,所以不能完全保证线程安全。比如经典的i++操作,分为读取、计算、赋值三步,volatile只能保证读取到最新值,但无法保证三步操作不被线程打断,多线程下依然会出现数据错乱。volatile适合的场景:仅作为状态标记变量、开关变量,只做赋值和读取,不做复合运算。12.volatile和synchronized的区别?参考答案1.保证特性不同:volatile保证可见性、有序性,不保证原子性;synchronized同时保证原子性、可见性、有序性。2.锁粒度不同:volatile只作用于变量;synchronized作用于方法、代码块,管控整片业务逻辑。3.阻塞特性不同:volatile不会造成线程阻塞,属于轻量级并发控制;synchronized会引发线程阻塞、竞争,开销更大。4.适用场景不同:volatile用于简单变量状态同步;synchronized用于复杂业务、复合操作的并发安全。五、进阶并发实操面试题13.多线程下ArrayList为什么不安全?怎么解决?参考答案:ArrayList是非线程安全集合,底层是动态数组。多线程同时执行add、扩容、赋值操作时,会出现元素覆盖、数组越界、数据丢失的问题,导致并发异常。日常解决方式有三种:1.使用Vector集合(底层方法全部加锁,并发安全,但性能较差);2.使用Collections.synchronizedList包装集合,简单高效,适合普通并发场景;3.使用CopyOnWriteArrayList并发集合,写时复制,读不加锁、写加锁,读多写少场景首选。14.讲一下你对AQS的理解?参考答案:AQS全称队列同步器,是Java并发包的核心底层框架,ReentrantLock、CountDownLatch、Semaphore等所有并发工具类,底层都是基于AQS实现的。AQS核心原理:通过一个state状态变量记录锁的持有状态,通过一个双向FIFO阻塞队列管理所有等待锁的线程。线程竞争锁成功,修改sta

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论