多线程面试题及答案(实战版).docxVIP

  1. 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多

多线程面试题及答案(实战版)

一、基础概念题(考察理解深度)

问题:线程和进程的核心区别是什么?实际开发中怎么选?

答案:核心区别在资源占用和调度粒度——进程是操作系统资源分配的最小单位(有独立内存空间、文件描述符),线程是CPU调度的最小单位(共享进程资源,仅占少量栈空间)。实际开发中,IO密集型场景(如网络请求、文件读写)用多线程(切换成本低),CPU密集型场景(如复杂计算)用多进程(避免GIL锁限制,充分利用多核);另外,进程间通信需用管道、消息队列等,线程间直接共享内存,更高效但要处理并发安全。

问题:Java中启动线程有几种方式?Runnable和Callable的核心差异是什么?

答案:实际开发中常用两种:①继承Thread类重写run();②实现Runnable接口重写run()。还有间接方式(如通过线程池提交任务),但本质都是基于前两种。Runnable和Callable的核心差异:①返回值:Runnable无返回值,Callable有泛型返回值;②异常:Runnable只能捕获异常,Callable可抛出checked异常;③使用场景:Runnable适合无结果的任务,Callable适合需要获取任务结果的场景(如异步计算),配合Future能获取执行结果。

问题:什么是线程的上下文切换?为什么会影响性能?

答案:上下文切换是CPU从一个线程切换到另一个线程执行时,保存当前线程的执行状态(寄存器、程序计数器、栈指针等),再加载目标线程状态的过程。影响性能的原因:①切换本身有开销(保存/加载状态、内核态与用户态切换);②频繁切换会导致CPU大部分时间花在切换上,而非执行业务逻辑;③破坏CPU缓存局部性,导致缓存命中率下降,进而降低执行效率。

二、并发安全题(考察实操经验)

问题:synchronized和volatile的区别?分别用在什么场景?

答案:核心区别在“原子性”和“可见性/有序性”:

volatile:仅保证可见性(线程修改后立即同步到主内存,其他线程读取必威体育精装版值)和有序性(禁止指令重排),不保证原子性(如i++仍会线程安全问题)。场景:修饰单一共享变量(如状态标记flag、计数器的辅助变量),无需原子操作的场景(如判断线程是否停止)。

synchronized:保证原子性、可见性、有序性(全量保障)。底层是对象锁(监视器锁),可修饰方法、代码块。场景:需要原子操作的场景(如i++、复杂业务逻辑同步),多个共享变量协同操作的场景。

补充:synchronized是重量级锁(JDK1.6后优化了偏向锁、轻量级锁),volatile是轻量级,无锁竞争时volatile效率更高。

问题:线程池的核心参数有哪些?核心线程数和最大线程数怎么设置?

答案:核心参数(ThreadPoolExecutor的构造参数):

参数设置原则:

核心线程数(corePoolSize):线程池常驻核心线程数,即使空闲也不销毁(除非设置allowCoreThreadTimeOut);

最大线程数(maximumPoolSize):线程池能容纳的最大线程数;

空闲线程存活时间(keepAliveTime):非核心线程空闲后的存活时间,超时销毁;

时间单位(unit):keepAliveTime的单位;

任务队列(workQueue):存放等待执行的任务(如ArrayBlockingQueue、LinkedBlockingQueue);

线程工厂(threadFactory):创建线程的工厂(可自定义线程名称、优先级);

拒绝策略(handler):任务队列满且线程数达最大值时的处理方式(如AbortPolicy直接抛异常、CallerRunsPolicy回退到调用线程执行)。

IO密集型(如HTTP请求、数据库操作):核心线程数=CPU核心数*2+1;最大线程数=CPU核心数*10(因线程大部分时间在等待IO,可多开线程提高利用率);

CPU密集型(如计算、排序):核心线程数=CPU核心数+1;最大线程数=CPU核心数*2(避免线程切换开销,充分利用多核);

补充:需结合任务队列长度,避免队列过长导致任务堆积(如用有界队列ArrayBlockingQueue,而非无界的LinkedBlockingQueue)。

问题:什么是死锁?产生死锁的必要条件是什么?怎么避免死锁?

答案:死锁是两个或多个线程互相持有对方需要的锁,且都不释放,导致永久阻塞的状态。

产生条件(缺一不可):①互斥条件(资源只能被一个线程占用);②持有并等待(

您可能关注的文档

文档评论(0)

151****9429 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档