版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Java高并发核心面试题及详细答案(实战版)一、并发基础核心面试题1.并行和并发的区别是什么?参考答案:并发是多个任务交替执行,宏观上看起来同时运行,微观上是单CPU快速切换调度,同一时刻只有一个任务在执行。比如单核CPU运行多线程程序,线程轮流抢占CPU时间片。并行是多个任务真正同时执行,需要多核CPU支持,多个核心在同一时刻分别执行不同任务。简单总结:并发是“交替做”,并行是“同时做”;并行一定是并发,并发不一定是并行。日常Java开发中,我们说的多并发,大多是基于CPU时间片切换的并发场景。2.线程和进程的区别?参考答案:进程:操作系统资源分配的最小单位,独立占用内存、CPU资源,进程之间相互隔离,通信成本极高。一个进程包含多个线程。线程:CPU调度的最小单位,共享所在进程的堆内存、方法区资源,仅拥有独立的栈内存和程序计数器。线程之间通信简单、切换成本低,也被称为轻量级进程。核心区别:进程资源独立、开销大;线程资源共享、开销小。3.Java线程的生命周期有哪些状态?参考答案:Java线程一共6种状态,定义在Thread.State枚举中:NEW(新建):线程对象创建,未调用start()方法,未启动RUNNABLE(可运行):包含就绪和运行两种状态,调用start()后进入,等待CPU调度或正在执行BLOCKED(阻塞):等待获取synchronized锁,锁被其他线程占用时进入该状态TERMINATED(终止):线程代码执行完毕或异常终止,生命周期结束二、线程安全与三大特性1.并发编程三大特性是什么?如何保证?参考答案:(1)原子性定义:一个操作要么全部执行成功,要么全部失败,不可中断。问题:i++不是原子操作,分为读取、修改、写入三步,多线程下会出现数据覆盖。保证方式:synchronized、Lock锁、Atomic原子类。(2)可见性定义:一个线程修改共享变量后,其他线程能立刻感知到最新值。问题:CPU缓存导致变量存在本地缓存,不会及时刷新到主内存,多线程下数据不可见。保证方式:volatile、synchronized、Lock。(3)有序性定义:程序执行顺序和代码编写顺序一致,禁止指令重排。问题:编译器、CPU会为了优化性能重排指令,多线程下会出现逻辑错乱。保证方式:volatile(禁止指令重排)、synchronized、Lock。2.volatile关键字的作用和局限性?参考答案:核心作用:保证变量的可见性、禁止指令重排,不保证原子性。适用场景:状态标记量、读写分离场景(单写多读)。局限性:无法保证复合操作原子性,i++、复合赋值等操作依旧线程不安全不能替代锁,无法解决多线程竞争修改的问题底层原理:通过内存屏障实现,写操作后强制刷新主内存,读操作前强制从主内存读取,同时禁止前后指令重排。3.什么是指令重排?会引发什么问题?参考答案:指令重排是编译器和CPU的优化手段,在不改变单线程执行结果的前提下,打乱代码执行顺序,提升运行效率。单线程下重排无影响,多线程下会出现业务逻辑错乱。最经典的案例是双重检查锁(DCL)单例模式,无volatile时,可能出现对象半初始化问题:指令重排导致先分配内存、赋值引用,再初始化对象,其他线程获取到未初始化完成的对象,引发空指针异常。三、锁机制核心面试题1.synchronized和ReentrantLock的区别?参考答案:(面试高频对比,核心8点)底层实现:synchronized是JVM底层原生锁,基于对象头监视器锁实现;ReentrantLock是JDK层面实现的锁,基于AQS队列。锁类型:synchronized默认非公平锁,不可手动修改;ReentrantLock支持公平锁、非公平锁自定义。可重入性:两者都是可重入锁,同一线程可多次获取同一把锁。超时机制:synchronized无超时,获取不到锁会一直阻塞;ReentrantLock支持tryLock超时获取,避免死等。可中断:synchronized不可中断,阻塞后无法响应中断;ReentrantLock支持可中断锁,线程可放弃锁竞争。条件队列:synchronized只有一个等待队列;ReentrantLock可创建多个Condition条件队列,精准唤醒指定线程,效率更高。锁释放:synchronized自动释放锁(代码块执行完毕/异常);ReentrantLock必须手动unlock,否则会永久死锁。性能:JDK1.6之后synchronized引入偏向锁、轻量级锁、重量级锁优化,性能基本和ReentrantLock持平,低并发下更优。2.synchronized的锁升级机制?参考答案:JDK1.6对synchronized做了重量级优化,锁会根据竞争情况自动升级,不可逆,升级顺序:偏向锁→轻量级锁→重量级锁。(1)偏向锁(无竞争场景)单线程频繁获取锁,无其他线程竞争。JVM默认偏向当前线程,无需每次加锁解锁,性能极高。(2)轻量级锁(轻微竞争场景)出现多线程竞争,但交替执行、无同时争抢。基于CAS自旋尝试获取锁,不阻塞线程,避免用户态和内核态切换开销。(3)重量级锁(激烈竞争场景)线程竞争激烈,CAS自旋失败次数过多。升级为重量级锁,未获取锁的线程直接阻塞,进入内核态等待,等待锁释放后被唤醒。核心特点:锁只能升级不能降级,目的是减少锁切换的性能开销。3.什么是死锁?产生条件及解决方案?参考答案:死锁定义:两个或多个线程互相持有对方需要的锁,同时等待对方释放锁,所有线程永久阻塞,程序卡死。死锁四大必要条件(必须同时满足):互斥条件:锁同一时刻只能被一个线程持有请求与保持:线程持有一把锁,同时请求另一把锁,不释放已有锁不可剥夺:锁只能持有者主动释放,其他线程无法强制抢占循环等待:多个线程形成锁等待闭环解决方案:只要破坏任意一个条件即可,最常用两种:统一锁获取顺序:所有线程按固定顺序获取多把锁,破坏循环等待使用tryLock超时机制:获取锁超时后主动放弃,避免永久等待四、AQS与JUC核心组件1.简单说下AQS的原理?参考答案:AQS(抽象队列同步器)是JUC所有锁和并发工具的底层核心,ReentrantLock、CountDownLatch、Semaphore等底层都是基于AQS实现。AQS核心三要素:state状态变量:volatile修饰的int变量,代表锁状态。0表示无锁,1表示有锁,大于1表示重入锁次数。CLH双向阻塞队列:获取锁失败的线程会封装成节点,加入队列尾部阻塞,等待锁释放后唤醒。独占/共享模式:独占模式(ReentrantLock)同一时刻只有一个线程获取锁;共享模式(CountDownLatch、Semaphore)支持多线程同时获取锁。核心流程:线程通过CAS修改state尝试抢锁,成功则执行逻辑;失败则入队阻塞,前驱节点释放锁后依次唤醒后继节点。2.CountDownLatch、CyclicBarrier、Semaphore的区别和场景?参考答案:(1)CountDownLatch(倒计时计数器)核心:一次性使用,计数器递减,减到0唤醒所有等待线程,不可重置。场景:主线程等待多个子线程执行完毕,再执行后续逻辑。(2)CyclicBarrier(循环栅栏)核心:可循环复用,线程到达栅栏后等待,凑齐指定数量线程后,统一唤醒所有线程,可重置重复使用。场景:多线程分批执行任务,每批线程全部就绪后统一执行下一步。(3)Semaphore(信号量)核心:控制并发线程数量,通过许可数量限制同时执行的线程数,支持限流。场景:接口限流、数据库连接池、资源抢占限流场景。3.Atomic原子类的原理?为什么比synchronized快?参考答案:Atomic系列原子类底层基于CAS无锁机制实现,配合volatile保证可见性。CAS原理:比较并交换,包含三个参数(内存地址、旧值、新值),仅当内存中的值和旧值一致时,才更新为新值,否则重试。性能优势:synchronized是阻塞式悲观锁,存在线程阻塞、内核态切换开销;CAS是无锁乐观操作,线程不阻塞,仅循环重试,低并发场景下性能远高于锁。CAS缺点:高并发下自旋重试次数多,CPU消耗高;存在ABA问题。4.什么是ABA问题?如何解决?参考答案:ABA问题:CAS比较时,只判断值是否一致。线程A读取值为A,线程B先将值改为B,再改回A,线程ACAS校验通过,但中间数据已经被修改过,存在数据风险。解决方案:使用带版本号的原子类,如AtomicStampedReference、AtomicMarkableReference。每次修改数据都会更新版本号,CAS同时校验值和版本号,彻底解决ABA问题。五、线程池核心面试题(重中之重)1.线程池的核心参数及工作原理?参考答案:ThreadPoolExecutor七大核心参数:corePoolSize:核心线程数,线程池常驻线程,空闲也不会回收maximumPoolSize:最大线程数,核心线程满、队列满后创建非核心线程keepAliveTime:非核心线程空闲超时时间,超时后被回收unit:超时时间单位workQueue:任务阻塞队列,存储等待执行的任务threadFactory:线程工厂,创建线程,可自定义线程名、优先级handler:拒绝策略,任务超过最大承载量时的处理策略线程池执行流程:接收新任务,判断核心线程数是否已满,未满则创建核心线程执行任务核心线程已满,判断队列是否未满,未满则将任务存入队列队列已满,判断最大线程数是否已满,未满则创建非核心线程执行任务最大线程数已满,触发拒绝策略2.线程池四种拒绝策略?参考答案:AbortPolicy(默认):直接抛出RejectedExecutionException异常,中断任务提交CallerRunsPolicy:谁提交任务谁执行,主线程自行处理过载任务,不抛异常DiscardPolicy:直接丢弃超额任务,无任何提示、无异常DiscardOldestPolicy:丢弃队列中最旧的未执行任务,尝试提交当前新任务3.为什么不推荐使用Executors创建线程池?参考答案:阿里开发规范明确禁止使用Executors快速创建线程池,核心原因是存在资源耗尽风险:newFixedThreadPool、newSingleThreadExecutor:使用无界队列,任务堆积过多会导致OOM内存溢出newCachedThreadPool、newScheduledThreadPool:最大线程数为Integer.MAX_VALUE,高并发下会创建大量线程,导致CPU耗尽、线程溢出最佳实践:手动通过ThreadPoolExecutor构造方法创建线程池,自定义核心参数、队列长度、拒绝策略,规避风险。4.线程池核心线程数如何设置?参考答案:根据任务类型区分设置,结合CPU核心数:CPU密集型任务:核心线程数=CPU核心数+1。CPU全程高速运算,避免线程频繁切换,多余1个线程兜底处理突发任务。IO密集型任务:核心线程数=CPU核心数*2或核心数/(1-阻塞系数)。IO任务耗时久、CPU空闲,可多开线程提升吞吐量。生产环境不建议写死数值,可通过配置文件动态配置,根据服务器压测结果微调。六、高并发实战与避坑面试题1.双重检查锁(DCL)单例模式为什么要加volatile?参考答案:不加volatile会因为指令重排导致单例失效,出现空指针问题。对象创建正常流程:分配内存→初始化对象→赋值引用。指令重排后可能变成:分配内存→赋值引用→初始化对象。此时其他线程判断对象不为空,直接获取使用,但对象还未初始化完成,直接报错。volatile可以禁止对象创建过程的指令重排,保证创建流程有序,实现线程安全的懒汉单例。2.并发下HashMap为什么不安全?JDK1.7和1.8的区别?参考答案:JDK1.7HashMap并发问题:多线程扩容时,头插法迁移数据会导致链表循环引用,触发死循环、CPU100%,同时存在数据覆盖丢失问题。JDK1.8HashMap并发问题:优化为尾插法,解决了循环链表死循环问题,但依旧线程不安全。多线程同时put会覆盖数据,多线程扩容会导致数据丢失,无法保证并发安全。并发替代方案:ConcurrentHashMap。3.ConcurrentHashMap的并发安全原理(JDK1.8)?参考答案:JDK1.8彻底放弃分段锁,采用CAS+synchronized+数组+链表+红黑树实现并发安全:无哈希冲突时,通过CAS无锁插入数据,效率极高出现哈希冲突时,对当前数组桶位的头节点加synchronized锁,锁粒度极小,仅锁定单个桶位,并发度高链表长度大于8且数组容量大于64,转换为红黑树,优化查询效率扩容采用多线程协助扩容机制,提升扩容效率核心优势:锁粒度细化,相比1.7的分段锁,并发性能大幅提升。4.什么是伪共享?如何避免?参考答案:CPU缓存以缓存行(64字节)为单位缓存数据。多个线程频繁修改同一个缓存行内的不同变量,会导致缓存行频繁失效、
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025全国医疗应急能力培训系列课程参考答案
- 2025医疗器械考试题及答案
- 2026年2026年江苏安全员b证考试试题
- 2025中小学生航空航天科普知识竞赛试题库试题及答案
- 2026年人工智能通识认证考核试题含答案
- 2025门球教练员考试题及答案
- 建设工程法规及相关知识
- XXXX年工程创优(保障性住房)培训班资料
- 外伤性头痛急救
- 多重耐药菌感染的预防课件
- 2026年云天化集团有限责任公司人员招聘笔试参考试题及详细答案解析
- 瓶装矿泉水生产成本核算
- 高三生物一轮复习教学设计:生态系统稳定性与生物多样性保护
- PIC-S PI 006-4 确认与验证新规全解读(2026版GMP验证实施指南)
- 《勤洗生活衣物》教学课件 - 2026-2027 学年滇教版初中劳动技术七年级上册
- 马尔康市人力资源和社会保障局2026年增量政策性岗位招募的(1人)考试备考试题及答案详解
- AI商标保护与价值挖掘
- 2025年10月自考13807计算机基础与应用技术真题试卷及答案
- 血气分析临床实战全解读
- 新疆交通投资集团有限责任公司笔试题目
- 防静电措施培训课件
评论
0/150
提交评论