Java线程高频面试题(真实面试版)_第1页
Java线程高频面试题(真实面试版)_第2页
Java线程高频面试题(真实面试版)_第3页
Java线程高频面试题(真实面试版)_第4页
Java线程高频面试题(真实面试版)_第5页
已阅读5页,还剩1页未读, 继续免费阅读

下载本文档

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

文档简介

Java线程高频面试题(真实面试版)说明:整套题目贴合一线企业真实面试场景,摒弃模板化话术,分为基础篇、核心原理篇、锁机制篇、线程池篇、实操问题篇,覆盖初/中/高级开发面试高频考点,答案简洁精准,适配面试口述场景。一、线程基础篇(初级必问)1.说说进程和线程的区别?进程是操作系统资源分配的最小单位,线程是CPU调度的最小单位。一个进程可以包含多个线程,线程共享进程的堆和方法区资源,每个线程有独立的栈内存和程序计数器。进程之间相互独立,开销大、切换慢;线程共享资源、通信简单,切换成本极低,是轻量级的进程。日常开发中多使用多线程提升程序运行效率。2.Java中线程的生命周期有哪些状态?Java线程一共6种状态,并非网上常说的5种,分别是:NEW(新建):线程对象创建完成,未调用start()方法RUNNABLE(就绪/运行):包含就绪和运行两种状态,等待CPU资源或正在执行BLOCKED(阻塞):等待获取synchronized锁,锁释放后进入就绪状态TERMINATED(终止):线程代码执行完毕或异常终止3.start()和run()方法的区别?为什么不直接调用run()?start()是启动线程的核心方法,会向操作系统申请创建新线程,由JVM调度执行run()方法,真正实现多线程并行执行,只能调用一次,重复调用会报异常。直接调用run()只是普通的对象方法调用,不会创建新线程,代码会在当前主线程中串行执行,失去多线程的意义。4.sleep()和wait()的核心区别?所属类不同:sleep是Thread类静态方法,wait是Object类方法锁机制不同:sleep休眠时不释放锁资源,wait会主动释放锁唤醒方式不同:sleep超时自动唤醒;wait需要notify/notifyAll唤醒(限时wait可超时唤醒)使用场景不同:sleep用于单纯延时,wait用于线程间通信、资源等待5.线程的yield()方法有什么作用?yield()会让当前正在运行的线程主动让出CPU执行权,从运行态回到就绪态,重新参与CPU竞争。它不会释放锁,也不会阻塞线程,只是临时放弃时间片,大概率让同优先级线程执行,优先级不同则不生效,实际开发中极少使用。二、线程核心原理篇(中级高频)1.什么是线程安全?导致线程不安全的原因是什么?线程安全指多线程同时操作共享资源时,程序运行结果和单线程执行结果一致,不会出现数据错乱、脏数据。线程不安全核心原因三点:多线程共享资源、线程交替执行、操作不具备原子性。典型场景:多线程累加变量、集合并发修改。2.什么是原子性、可见性、有序性?JVM如何保证?原子性:一个操作或多个操作要么全部执行成功,要么全部不执行,不可中断。synchronized、Lock可以保证原子性。可见性:一个线程修改共享变量后,其他线程能立即感知到最新值。volatile、synchronized可以保证可见性。有序性:代码执行顺序和编写顺序一致,禁止指令重排。volatile可以禁止指令重排,保证有序性。3.volatile关键字的作用?能保证线程安全吗?volatile有两个核心作用:保证共享变量的可见性、禁止指令重排。不能保证线程安全。因为volatile不保证操作原子性,比如i++操作是读取、修改、写入三步,多线程下依旧会出现数据覆盖问题。一般用于状态标记、双重校验锁单例模式等场景。4.什么是指令重排?为什么会出现?为了提升CPU执行效率,编译器和CPU会在不影响单线程执行结果的前提下,打乱代码的执行顺序,这就是指令重排。单线程下无影响,多线程下会导致程序逻辑错乱,volatile可以通过内存屏障禁止重排。5.线程死锁的产生条件和如何避免?死锁四大必要条件(必须同时满足):互斥条件:资源同一时间只能被一个线程占用请求与保持:线程持有已有资源,同时请求新资源不可剥夺:已持有资源不能被其他线程强制抢占循环等待:多个线程互相持有对方需要的资源,形成闭环避免方案:破坏循环等待条件(统一锁的获取顺序)、设置锁超时、使用tryLock、减少嵌套锁。三、锁机制篇(中高级核心)1.synchronized和Lock锁的区别?底层实现:synchronized是JVM底层原生锁,基于对象头监视器实现;Lock是Java代码层面的锁,基于AQS实现锁特性:synchronized是隐式锁,自动加锁释放锁;Lock是显式锁,需要手动lock()、unlock()灵活性:Lock支持超时锁、可中断锁、读写锁,功能更丰富;synchronized功能单一锁升级:synchronized有偏向锁、轻量级锁、重量级锁升级机制;Lock无锁升级公平锁:synchronized默认非公平锁;Lock可手动指定公平/非公平锁2.讲讲synchronized的锁升级机制?JDK1.6之后对synchronized做了优化,锁会根据竞争情况自动升级,不可逆:偏向锁→轻量级锁→重量级锁。无竞争时是偏向锁,偏向首个获取锁的线程;轻微竞争时升级为轻量级锁,基于自旋尝试获取锁;竞争激烈、自旋失败后升级为重量级锁,阻塞等待,效率降低。3.什么是AQS?核心原理是什么?AQS是队列同步器,是Java中所有Lock锁、并发工具类的底层核心。核心原理是:通过volatile修饰的state变量记录锁状态,配合双向阻塞队列管理等待线程。线程获取锁成功则修改state状态,获取失败则进入队列阻塞;持有锁的线程释放锁后,唤醒队列中的下一个线程竞争锁。4.读写锁ReentrantReadWriteLock的使用场景?读写锁特点:读锁共享、写锁独占。多个线程可以同时加读锁,提升读操作效率;有写锁时,所有读写操作阻塞,保证数据一致性。适用于读多写少的场景,比如缓存查询、配置读取,相比普通独占锁,能大幅提升并发性能。5.可重入锁是什么意思?synchronized是可重入锁吗?可重入锁指同一个线程可以多次获取同一把锁,不会出现自己阻塞自己的情况。synchronized和ReentrantLock都是可重入锁,底层会记录线程持有者和锁计数,每次加锁计数+1,释放锁计数-1,计数为0才真正释放锁。四、线程池篇(面试重点)1.为什么要用线程池?不直接newThread?频繁创建和销毁线程开销极大,浪费系统资源。线程池可以复用线程、控制并发数量、避免无限创建线程导致的OOM,同时统一管理线程任务,提升响应速度、便于监控运维。2.线程池七大核心参数?各自作用?corePoolSize核心线程数:线程池常驻线程,空闲也不会被回收maximumPoolSize最大线程数:线程池允许创建的最大线程数量keepAliveTime空闲超时时间:非核心线程空闲超时后被回收unit时间单位:配合超时时间的单位workQueue任务队列:存储等待执行的任务threadFactory线程工厂:创建线程,可自定义线程名称、优先级handler拒绝策略:任务满负荷时的处理策略3.线程池的执行流程?1.提交任务后,判断当前线程数是否小于核心线程数,小于则新建核心线程执行任务;2.核心线程已满,判断任务队列是否已满,未满则将任务存入队列;3.队列已满,判断当前线程数是否小于最大线程数,小于则新建非核心线程执行任务;4.线程数达到最大值,触发拒绝策略处理任务。4.四种常见拒绝策略?AbortPolicy(默认):直接抛出异常,终止任务CallerRunsPolicy:由提交任务的主线程自行执行任务DiscardPolicy:直接丢弃当前任务,无异常DiscardOldestPolicy:丢弃队列最旧任务,执行当前新任务5.阿里开发规范为什么禁止使用Executors创建线程池?Executors创建的线程池参数固定,存在严重风险:FixedThreadPool、SingleThreadPool队列无界,任务过多会导致OOM;CachedThreadPool最大线程数无限制,大量任务会创建海量线程,耗尽CPU资源。生产环境必须手动通过ThreadPoolExecutor创建线程池。五、高频实操场景题(面试加分项)1.如何实现三个线程按顺序执行?常见三种方案:使用join()方法、使用synchronized+状态标记、使用CountDownLatch计数器。日常开发中CountDownLatch最简洁高效。2.CountDownLatch、CyclicBarrier、Semaphore的区别和场景?CountDownLatch:一次性计数器,主线程等待子线程全部执行完毕,不可重置,适用于多任务汇总场景。CyclicBarrier:可循环屏障,多个线程互相等待,全部到达屏障点后再统一执行,支持重置,适用于分阶段并行任务。Semaphore:信号量,控制并发线程数量,限流专用,适用于接口限流、资源抢占场景。3.多线程下ArrayList为什么不安全?怎么解决?ArrayList底层数组扩容、添加元素操作非原子性,多线程并发添加会出现元素覆盖、数组越界、数据丢失问题。解决方案:使用Vector、Collections.synchronizedList、CopyOnWriteArrayList。读多写少用CopyOnWriteArrayList,写多场景不推荐。4.线程异常怎么处理?子线程异常会影响主线程吗?默认情况下,子线程抛出未捕获异常会直接终止当前线程,

温馨提示

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

评论

0/150

提交评论