版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Java线程高频面试题及详细答案(实战接地气版)一、线程基础篇(初级必问)1.说说线程和进程的区别?这个问题是面试基础必考,我按工作中实际理解来说,不背概念:进程是操作系统资源分配的最小单位,线程是CPU调度的最小单位。简单讲:一台服务器上跑的一个个程序就是进程,比如IDEA、Tomcat、MySQL,每个进程都是独立的,有自己独立的内存空间,进程之间互不干扰,创建和销毁成本极高。而线程是进程里面的执行单元,一个进程可以包含多个线程。比如Tomcat进程里,会开很多线程去处理用户请求。同一个进程下的所有线程共享堆内存和方法区,只有栈内存是各自独立的,所以线程创建、切换、销毁的成本非常低。核心区别总结:资源:进程独立资源,线程共享进程资源开销:进程开销大,线程轻量、开销小隔离性:进程完全隔离,线程共享数据、存在线程安全问题通信:进程间通信复杂,线程直接共享变量通信2.Java中创建线程有几种方式?区别是什么?日常面试和开发中,核心就四种,我按常用程度排序:(1)继承Thread类自定义类继承Thread,重写run()方法,调用start()启动线程。缺点:单继承限制,不能再继承其他类,基本项目里很少用。(2)实现Runnable接口实现run()方法,传入Thread对象启动。无继承限制,灵活,业务开发最常用。缺点:无返回值、不能抛异常。(3)实现Callable接口JDK1.5新增,重写call()方法。支持返回值、支持抛出异常,需要配合FutureTask使用。适合需要线程执行结果的场景。(4)线程池创建线程实际项目中绝对首选,不手动new线程。通过Executors或ThreadPoolExecutor创建,统一管理线程,避免频繁创建销毁线程造成资源浪费。重点区分:start()和run()的区别直接调用run()只是普通的方法调用,还是在当前主线程执行,没有开启新线程;调用start()才是真正向JVM发起线程创建请求,由操作系统调度执行run()方法。3.线程的生命周期有哪些状态?Java线程一共6种状态,不是网上说的5种,以Thread.State枚举为准:NEW(新建):线程对象创建完毕,没调用start(),未启动RUNNABLE(就绪+运行):包含就绪和运行两种状态,等待CPU资源或正在执行BLOCKED(阻塞):等待获取synchronized锁,锁释放后进入就绪状态TERMINATED(终止):线程执行完毕或异常退出,生命周期结束高频面试点:sleep是线程休眠、不释放锁;wait是等待、释放锁,这是核心区别。4.sleep()、wait()、yield()、join()区别?这四个方法是基础高频,我结合实际场景说:sleep():Thread静态方法,限时休眠,不释放锁,只靠时间自动唤醒,不依赖其他线程。常用于简单延时。wait():Object方法,必须在同步代码块中使用,释放锁,无限等待,需要notify/notifyAll唤醒。用于多线程间通信。yield():Thread静态方法,让出当前CPU时间片,线程回到就绪状态,不保证一定让出,基本开发不用,面试了解即可。join():让当前主线程等待子线程执行完毕,再继续往下执行。底层就是wait()实现,适合线程执行顺序控制。二、线程安全与锁机制(中频核心)1.什么是线程安全?导致线程不安全的原因?多线程同时操作共享变量,最终结果和单线程执行结果不一致,就是线程不安全。根本原因三个:原子性:多个操作不具备原子性,比如i++是读取、修改、写入三步,多线程会覆盖结果可见性:CPU缓存导致,一个线程修改了共享变量,其他线程看不到最新值有序性:JVM和CPU为了优化性能,会指令重排,打乱代码执行顺序所有线程安全问题,本质都是这三个特性被破坏了。2.synchronized和Lock的区别?面试必问,日常开发最常用的两种锁,对比非常清晰:synchronized(内置锁)JVM底层实现,原生语法,自动加锁、自动释放锁阻塞式锁,线程拿不到锁会一直阻塞只能是非公平锁,不可中断适合简单场景,代码简洁,JDK1.6后做了偏向锁、轻量级锁、重量级锁优化,性能很高Lock(显式锁,ReentrantLock)Java代码层面实现的锁,需要手动lock()、unlock(),必须在finally释放锁功能更强大:可重入、可中断、可超时、支持公平锁/非公平锁可以绑定多个条件Condition,精准唤醒指定线程,比notifyAll高效适合复杂并发场景,比如高并发、锁竞争激烈、需要精准控制线程等待唤醒实战结论:简单同步用synchronized,复杂并发控制用ReentrantLock。3.volatile关键字的作用?能保证线程安全吗?volatile核心作用两点:保证可见性、禁止指令重排。它不能保证原子性,所以不能保证线程安全。举个最常见的例子:volatile修饰count,多线程执行count++依旧不安全。因为count++是三步操作,volatile只能保证每次读到最新值,无法保证三步操作不被打断。日常使用场景:状态标记量、双重校验锁单例模式(解决指令重排问题)。4.讲讲synchronized的锁升级机制?JDK1.6之后为了优化性能,引入锁升级,锁状态不可逆:偏向锁→轻量级锁→重量级锁。偏向锁:默认开启,假设只有一个线程频繁获取锁,不需要竞争,直接给线程偏向权限,无开销轻量级锁:出现多线程竞争,偏向锁升级为轻量级锁,通过CAS自旋抢锁,不阻塞线程重量级锁:自旋次数过多、竞争激烈,升级为重量级锁,线程阻塞,依赖操作系统互斥量,开销最大核心目的:无竞争用轻量锁提升性能,高竞争用重量级锁保证安全。三、线程池核心考点(面试重中之重)1.为什么要用线程池?为什么不手动newThread?手动创建线程弊端非常多,项目中绝对禁止:频繁创建、销毁线程,开销极大,浪费CPU和内存资源无限制创建线程,会导致线程数量过多,系统OOM、CPU飙高无法统一管理线程,无法监控、调优线程池优势:复用线程,减少创建销毁开销控制最大并发数,保护系统资源统一管理、可监控、可调优2.线程池七大核心参数?以ThreadPoolExecutor为准,七个参数必须熟记:corePoolSize:核心线程数,线程池常驻线程,空闲也不回收maximumPoolSize:最大线程数,线程池允许创建的最大线程数量keepAliveTime:空闲线程存活时间,非核心线程空闲超时会被回收unit:存活时间单位workQueue:任务阻塞队列,存放等待执行的任务threadFactory:线程工厂,创建线程,可自定义线程名、优先级handler:拒绝策略,任务满了之后的处理方式3.线程池任务执行流程?非常经典的流程,面试高频口述题:提交任务,首先判断当前线程数是否小于核心线程数,小于则新建核心线程执行任务核心线程已满,判断阻塞队列是否未满,未满则将任务放入队列队列已满,判断当前线程数是否小于最大线程数,小于则新建非核心线程执行任务线程数达到最大值、队列也满了,触发拒绝策略4.四种拒绝策略?AbortPolicy(默认):直接抛出异常,阻止任务提交CallerRunsPolicy:谁提交的任务谁执行(主线程自己跑),不抛异常、不丢弃DiscardPolicy:直接丢弃当前任务,无异常、无日志DiscardOldestPolicy:丢弃队列最旧的任务,执行当前新任务5.为什么不推荐使用Executors创建线程池?阿里开发规范强制禁止,原因很简单:Executors封装的线程池参数固定,存在风险:newFixedThreadPool/newSingleThreadExecutor:队列是无界队列,任务堆积会导致OOMnewCachedThreadPool:最大线程数无限,高并发下创建大量线程,直接打满CPU、OOM开发规范:必须手动通过ThreadPoolExecutor自定义线程池,根据业务设置核心参数、队列、拒绝策略。四、并发常见问题与高频面试题1.什么是CAS?优缺点?CAS是无锁乐观锁机制,全称比较并交换。原理:操作共享变量时,先比较内存值和预期值是否一致,一致则更新,不一致则重试。Java中Atomic系列原子类底层都是CAS实现。优点:无锁、不阻塞、并发性能高缺点:自旋重试消耗CPU,竞争激烈时性能差存在ABA问题只能保证单个变量原子性,无法保证代码块原子性ABA问题解决:使用AtomicStampedReference,增加版本号标记。2.什么是死锁?产生死锁的四个必要条件?如何避免?死锁就是多个线程互相持有对方需要的锁,互相等待,永久阻塞,程序卡死。四个必要条件(缺一不可):互斥条件:锁同一时间只能被一个线程持有请求与保持:线程持有自己的锁,同时请求其他锁不可剥夺:锁只能自己主动释放,不能被其他线程抢占循环等待:多个线程形成锁等待闭环避免死锁思路:破坏任意一个条件即可,最常用的是统一锁的获取顺序、减少嵌套锁、设置锁超时。3.ThreadLocal原理和坑点?ThreadLocal是线程本地变量,每个线程独有一份变量副本,线程间互不干扰。底层原理:每个Thread内部维护一个ThreadLocalMap,key是ThreadLocal对象,value是存储的变量值。实战坑点(面试重点):内存泄漏:ThreadLocalMap的key是弱引用,value是强引用。线程不销毁(线程池线程常驻),value会一直堆积,导致内存泄漏必须手动remove():使用完ThreadLocal一定要调用remove清除数据线程池场景下复用线程,会导致脏数据问题4.并发工具类CountDownLatch、CyclicBarrier、Semaphore区别?CountDownLatch:倒计时计数器,一个主线程等待多个子线程执行完毕,一次性使用,不可重置。比如批量任务等待所有任务完成。CyclicBarrier:循环栅栏,多个线程互相等待,全部到达临界点后再一起执行,可循环复用。比如多人组队同步执行。Semaphore:信号量,控制并发线程数量,限流场景专用。比如接口限流、连接池资源控制。五、高频手撕面试题(简答)1.如何保证三个线程按顺序
温馨提示
- 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年卫生高级职称面审答辩(儿童保健代码094)在线题库副高面
- 2026年国考证监会专业通关练习试题完整版附答案详解
- 链家员工合同
- 民办高校管理风险剖析与防范体系构建:理论、实践与创新路径
- 化学化工专业英语讲义
- CAM制造软件厂商竞争格局研究市场调研报告
- 2026银行间市场数据报告库(上海)股份有限公司招聘30人笔试参考题库及答案解析
- 2026高考数学复习微专题:75.立体几何与解析几何综合问题的三种常见类型
- 2026年宠物食品欧美细分市场项目投资计划书
- 量力而行议论文
评论
0/150
提交评论