版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Java线程高频面试题及详细实战答案一、线程基础核心面试题1.说说进程和线程的区别?参考答案:进程是操作系统资源分配的最小单位,线程是CPU调度执行的最小单位。1.资源占用:进程拥有独立的内存空间,各个进程完全隔离;线程共享所在进程的堆内存、方法区资源,仅私有栈内存和程序计数器,资源开销极小。2.执行粒度:进程是程序的一次完整运行过程,独立性强;线程是进程内的执行分支,一个进程至少包含一个主线程。3.开销成本:进程创建、销毁、切换的系统开销极大;线程开销非常小,切换速度快。4.通信方式:进程间通信复杂,需要借助管道、socket、共享内存等;线程间直接共享进程资源,通信简单,通过全局变量即可实现。5.容错性:一个进程崩溃不会影响其他进程;一个线程异常崩溃,会直接导致整个进程终止。2.Java中创建线程有几种方式?分别是什么?参考答案:日常开发和面试中,核心分为四种创建方式,前两种是基础方式,后两种是实际开发常用方式:1.继承Thread类:自定义类继承Thread,重写run()方法,调用start()启动线程。缺点是单继承限制,无法再继承其他类,灵活性差。2.实现Runnable接口:重写run()方法,将实现类传入Thread对象启动。规避了单继承问题,无返回值、无异常抛出。3.实现Callable接口:重写call()方法,支持泛型返回值、可抛出异常,需要配合FutureTask、Thread使用,适合需要获取线程执行结果的场景。4.线程池创建:通过Executors工具类或ThreadPoolExecutor自定义线程池,批量管理线程,是企业开发首选,避免频繁创建销毁线程的资源消耗。补充重点:启动线程必须调用start()方法,run()只是普通方法调用,不会开启新线程,只会在当前主线程中执行代码。3.线程的生命周期有哪些状态?分别代表什么场景?参考答案:Java线程一共有6种状态,定义在Thread.State枚举中:1.NEW(新建):线程对象创建完成,但未调用start()方法,尚未开启线程。2.RUNNABLE(可运行):包含就绪和运行两种状态,调用start()后进入就绪状态,等待CPU时间片;获取CPU资源后进入运行状态,执行run()方法。3.BLOCKED(阻塞):线程等待获取synchronized同步锁,锁被其他线程占用时,当前线程进入阻塞状态,不占用CPU资源。6.TERMINATED(终止):线程代码执行完毕,或异常终止,线程生命周期结束,无法再次启动。4.sleep()、wait()、yield()、join()的区别?参考答案:1.sleep():Thread类静态方法,让线程限时休眠,不释放锁,仅放弃CPU执行权,时间到后自动恢复运行,可在任意场景调用。2.wait():Object类方法,必须在同步代码块/同步方法中调用,主动释放锁,进入无限等待,需要notify()/notifyAll()唤醒,支持设置超时时间。3.yield():Thread类静态方法,主动让出当前CPU时间片,线程回到就绪状态,不释放锁、不阻塞,大概率让同级优先级线程执行,不保证一定让出。4.join():线程插队执行,当前线程等待调用join方法的线程执行完毕后,再继续执行,底层基于wait()实现,会释放锁。常用于多线程结果汇总场景。二、线程安全与锁机制面试题1.什么是线程安全?导致线程不安全的原因是什么?参考答案:线程安全指多线程同时操作共享资源时,程序运行结果和单线程执行结果一致,不会出现数据错乱、脏数据的问题。反之则为线程不安全。核心导致线程不安全的三大原因:1.共享资源:多个线程同时操作同一个成员变量、静态变量等共享数据。2.原子性问题:复合操作(i++、i--)不具备原子性,会被CPU指令拆分,多线程交替执行导致数据覆盖。3.可见性问题:一个线程修改共享变量后,值存储在自己的工作内存中,没有及时刷新到主内存,其他线程无法感知最新值。4.有序性问题:CPU和JVM的指令重排序,打乱代码执行顺序,导致多线程场景下逻辑异常。2.synchronized和Lock的区别?参考答案:1.底层实现:synchronized是JVM原生底层锁,基于对象头监视器锁实现,隐式加锁解锁;Lock是Java代码层面的锁,是接口,常用实现类ReentrantLock,手动加锁、解锁。2.锁释放机制:synchronized代码执行完毕或异常时,自动释放锁,不会死锁;Lock必须手动调用unlock()解锁,异常不处理会导致锁永久占用,引发死锁。3.灵活性:Lock功能更强,支持可中断锁、限时锁、公平锁/非公平锁、读写锁;synchronized仅支持非公平锁,功能单一。4.锁粒度与性能:JDK1.6后synchronized做了偏向锁、轻量级锁、重量级锁优化,性能大幅提升,低并发场景性能优于Lock;高并发、竞争激烈场景下,Lock性能更稳定。5.适用场景:简单同步场景优先用synchronized;需要精细控制锁、高并发、读写分离场景优先用ReentrantLock。3.什么是volatile关键字?作用是什么?不能保证什么?参考答案:volatile是Java轻量级同步关键字,主要作用有两个:1.保证可见性:被volatile修饰的变量,修改后会立即刷新到主内存,同时失效其他线程的工作内存缓存,所有线程读取的都是主内存最新值。2.保证有序性:禁止指令重排序,避免JVM和CPU优化打乱代码执行顺序,解决单例模式双重锁的指令重排问题。核心短板(面试必问):volatile不保证原子性。对于i++、数据累加等复合操作,volatile无法保证操作不可拆分,多线程下依然会出现数据不安全问题,需要配合锁或Atomic原子类解决。4.讲讲Java锁的升级机制(偏向锁、轻量级锁、重量级锁)参考答案:JDK1.6对synchronized进行锁优化,锁会根据竞争情况自动升级,只能升级、不能降级,升级顺序:偏向锁→轻量级锁→重量级锁。1.偏向锁:无锁竞争场景,JVM默认开启,偏向第一个获取锁的线程。后续该线程重复获取锁,无需任何同步操作,性能极高,适配单线程频繁加锁场景。2.轻量级锁:出现少量锁竞争、线程交替执行同步代码块时,偏向锁升级为轻量级锁。基于CAS自旋尝试获取锁,不阻塞线程,适配低并发、交替竞争场景。3.重量级锁:大量线程同时竞争锁,CAS自旋失败次数过多,轻量级锁升级为重量级锁。基于操作系统互斥量实现,未获取锁的线程直接阻塞,CPU开销大,并发效率低。三、线程池核心面试题(高频重点)1.为什么要用线程池?直接newThread有什么问题?参考答案:直接频繁newThread的弊端:1.线程创建、销毁是重量级操作,频繁创建会消耗大量CPU和内存资源,性能极低。2.无限制创建线程,会导致线程数量过多,CPU频繁切换上下文,引发系统卡顿、OOM内存溢出。3.线程无法统一管理,执行顺序、超时、并发数都不可控,问题排查困难。线程池的核心优势:1.复用线程,减少创建销毁开销,提升系统响应速度。2.统一管控线程数量,限制最大并发数,保护系统资源。3.支持任务排队、超时策略、拒绝策略,适配各类业务场景。2.ThreadPoolExecutor七大核心参数?参考答案:这是线程池核心考点,所有业务线程池都基于这7个参数构建:1.corePoolSize(核心线程数):线程池常驻线程数量,即使空闲也不会被回收。2.maximumPoolSize(最大线程数):线程池允许创建的最大线程数量,核心线程满、队列满后才会新建非核心线程。3.keepAliveTime(空闲超时时间):非核心线程的空闲存活时间,超时无任务则被回收。4.unit(时间单位):keepAliveTime的时间单位。5.workQueue(任务队列):存储等待执行任务的阻塞队列,核心线程满后,新任务进入队列排队。6.threadFactory(线程工厂):用于创建线程,可自定义线程名称、优先级、守护线程属性,方便问题排查。7.handler(拒绝策略):线程池线程和队列都满时,新任务的处理策略。3.线程池四种拒绝策略?参考答案:1.AbortPolicy(默认):直接抛出RejectedExecutionException异常,中断任务提交,适合核心业务,及时暴露问题。2.CallerRunsPolicy:由提交任务的主线程自己执行任务,不丢弃、不报错,适合非核心业务,降级保可用。3.DiscardPolicy:直接丢弃新任务,不报错、不处理,适合无关紧要的日志、统计类任务。4.DiscardOldestPolicy:丢弃队列中最旧的未执行任务,执行当前新任务,适合时效性高的任务。4.说说线程池的任务执行流程?参考答案:1.提交新任务,首先判断当前运行线程数是否小于核心线程数,是则直接新建核心线程执行任务。2.核心线程已满,判断任务队列是否未满,是则将任务存入队列排队。3.队列已满,判断当前线程数是否小于最大线程数,是则新建非核心线程执行任务。4.线程数已达到最大值、队列已满,触发拒绝策略处理新任务。5.为什么不推荐使用Executors创建线程池?参考答案:阿里开发手册强制禁止使用Executors,核心原因是参数封装过于简单,存在严重线上风险:1.newFixedThreadPool、newSingleThreadExecutor:使用无界队列,任务堆积过多会导致内存溢出OOM。2.newCachedThreadPool、newScheduledThreadPool:最大线程数无限制,高并发下会创建大量线程,导致CPU打满、系统崩溃。企业规范:生产环境必须手动通过ThreadPoolExecutor自定义线程池,指定合理的核心线程数、最大线程数、有界队列和拒绝策略。四、并发高阶问题面试题1.什么是死锁?死锁产生的四个必要条件?如何避免死锁?参考答案:死锁是多个线程互相持有对方需要的锁,同时等待对方释放锁,所有线程永久阻塞,程序卡死无法执行。死锁四大必要条件(必须同时满足):1.互斥条件:锁资源同一时间只能被一个线程持有。2.请求与保持条件:线程持有已有锁,同时请求新的锁,不释放原有锁。3.不可剥夺条件:锁只能被持有者主动释放,其他线程无法强制抢占。4.循环等待条件:多个线程形成锁资源循环等待闭环。避免死锁的核心方案:1.破坏循环等待:所有线程统一锁的获取顺序。2.破坏请求保持:一次性获取所有需要的锁,不分步申请。3.使用限时锁:ReentrantLock.tryLock(time),超时自动放弃锁请求。2.Atomic原子类的原理是什么?参考答案:AtomicInteger、AtomicLong等原子类,核心基于CAS无锁自旋实现线程安全,不使用synchronized和Lock,并发性能更高。CAS原理:比较并交换,包含三个参数(内存值V、旧预期值E、新值N)。执行逻辑:判断内存当前值V是否等于预期旧值E,相等则说明数据未被修改,直接更新为新值N;不相等则说明数据已被其他线程修改,放弃本次更新,重新获取值再次自旋尝试,直到更新成功。CAS缺
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年其他非货币银行服务行业产业链安全评估报告及未来五至十年品牌溢价与忠诚度管理
- 2026年华鲁控股集团有限公司人员招聘考试模拟试题及详细答案解析
- 2026年软性隐形眼镜行业洞察报告及未来五至十年发展趋势报告
- 2026年空调用空气过滤器行业洞察报告及未来五至十年发展趋势报告
- 2026年有机调味品行业洞察报告及未来五至十年发展趋势报告
- 2026年度山东省临沂市专业技术人员继续教育公需科目试卷及答案
- 2026年度全国安全生产网络知识竞赛试题库及答案
- 2026年度内蒙古专业技术人员继续教育公需科目试卷及答案
- 高三生物一轮复习细胞膜的结构和功能默背手册配套教学设计
- 小学四年级音乐《田园随想》教学设计:听觉感知与创造性表达
- 2026重庆三峰环境集团股份有限公司招聘82人考试模拟试题及答案解析
- UOM无人机安全操控理论合格证(2026)题库+答案详解
- LW36-126型户外自能式高压六氟化硫断路器安装使用说明书
- 2026年期权开户考试题库及答案
- 《人民当家作主》教学课件 - 2026-2027 学年统编版(新教材)小学道德与法治五年级上册
- 血液透析用中心静脉导管护理专家共识(2025版)
- 急性心脏压塞急救护理
- GA/T 1399.4-2023公安视频图像分析系统第4部分:视频图像检索技术要求
- 四川省森林资源规划设计调查技术细则
- 舒伯职业生涯发展理论
- 统计学基础知识
评论
0/150
提交评论