Java多线程面试题及答案_Java多线程面试题深度解析

发布时间 - 2026-01-24 00:00:00    点击率:
Java多线程面试重在实战经验而非背诵;wait()必须在synchronized块中调用,否则抛IllegalMonitorStateException;ConcurrentHashMap JDK8用CAS+单桶锁替代分段锁;线程池拒绝策略中CallerRunsPolicy更防雪崩;ThreadLocal内存泄漏因key弱引用而value强引用未及时清理。

Java多线程面试题不是考背诵,而是考你有没有真正写过多线程代码、踩过坑、调过问题。光知道 synchronizedvolatile 的定义,答不对真问题。

为什么 wait() 必须在 synchronized 块里调用?

这不是语法限制,而是语义强制:只有持有对象锁的线程才能进入等待队列。否则会抛 IllegalMonitorStateException。JVM 需要确保线程在释放锁前已“登记”进该对象的等待集,否则唤醒逻辑会错乱。

  • 常见错误:在 if 判断后直接 wait(),没加 synchronized —— 编译不报错,运行必崩
  • 正确写法必须是:synchronized(obj) { if (!condition) obj.wait(); }
  • wait() 会原子性地释放锁 + 挂起;而 sleep() 不释放锁,也不能被 notify() 唤醒

ConcurrentHashMap 在 JDK 8 中如何避免分段锁?

JDK 8 彻底移除了 Segment,改用 Node 数组 + synchronized 锁单个桶(bin)+ CAS 控制扩容。这意味着读操作完全无锁,写操作只锁冲突的哈希桶,不是整个表。

  • 注意 size() 不再是 O(1):它要遍历所有 bin 的计数器求和,可能有轻微延迟
  • computeIfAbsent() 是线程安全的,但传入的 mappingFunction 不应在其中修改 map 自身,否则可能死锁
  • 如果 key 或 value 为 null,会直接抛 NullPointerException —— 这和 HashMap 的容忍不同

线程池拒绝策略选哪个?AbortPolicy 真的是最安全的吗?

默认的 AbortPolicy 直接抛 RejectedExecutionException,看似“及时止损”,但在高可用服务中反而容易引发雪崩:上游重试 + 拒绝堆叠 → 更多拒绝。

  • CallerRunsPolicy 更适合突发流量:让提交线程自己执行任务,自然降速,避免队列爆炸
  • 自定义策略时,别只打日志——要考虑是否要落盘、告警、或降级返回默认值
  • 注意 ThreadPoolExecutor 构造参数顺序:

    corePoolSize、maxPoolSize、keepAliveTime、unit、workQueue、threadFactory、handler —— 错一位就可能创建出不符合预期的池

为什么 ThreadLocal 可能导致内存泄漏?

根本原因是 ThreadLocalMap 中的 key 是弱引用(WeakReference),value 是强引用。当 ThreadLocal 实例被回收后,key 变为 null,但 value 仍被 map 持有,且该 entry 无法被自动清理,除非线程执行下一次 get()/set() 触发探测式清理。

  • Web 应用中最典型场景:用 ThreadLocal 存用户上下文,但 Filter 中没调 remove(),线程被 Tomcat 复用后,旧请求的 value 一直残留
  • 最佳实践:每次使用完务必显式调用 threadLocal.remove(),尤其在线程池环境
  • 不要把大对象塞进 ThreadLocal,比如 StringBuilder 或缓存 Map —— 它们生命周期由线程决定,不受 GC 正常控制

多线程的复杂性不在概念,而在状态交织与时机依赖。哪怕一行 count++,背后可能是 CPU 缓存行伪共享、指令重排、JIT 优化干扰 —— 面试问得越细,越说明他们想知道你是不是真 debug 过并发 bug。


# java  # node  # app  # tomcat  # ai  # java多线程  # 无锁  # 为什么 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel怎么实现微信登录_Laravel Socialite第三方登录集成  浅析上传头像示例及其注意事项  网站制作免费,什么网站能看正片电影?  智能起名网站制作软件有哪些,制作logo的软件?  最好的网站制作公司,网购哪个网站口碑最好,推荐几个?谢谢?  详解Oracle修改字段类型方法总结  如何用已有域名快速搭建网站?  谷歌浏览器如何更改浏览器主题 Google Chrome主题设置教程  如何在搬瓦工VPS快速搭建网站?  lovemo网页版地址 lovemo官网手机登录  如何快速查询网站的真实建站时间?  如何在建站之星网店版论坛获取技术支持?  教你用AI将一段旋律扩展成一首完整的曲子  Laravel如何实现事件和监听器?(Event & Listener实战)  如何在云服务器上快速搭建个人网站?  儿童网站界面设计图片,中国少年儿童教育网站-怎么去注册?  Laravel如何使用Service Provider注册服务_Laravel服务提供者配置与加载  HTML5段落标签p和br怎么选_文本排版常用标签对比【解答】  如何在服务器上三步完成建站并提升流量?  如何撰写建站申请书?关键要点有哪些?  Laravel事件监听器怎么写_Laravel Event和Listener使用教程  微信小程序 五星评分(包括半颗星评分)实例代码  历史网站制作软件,华为如何找回被删除的网站?  悟空浏览器如何设置小说背景色_悟空浏览器背景色设置【方法】  Laravel如何使用.env文件管理环境变量?(最佳实践)  如何在阿里云香港服务器快速搭建网站?  如何在IIS中新建站点并配置端口与物理路径?  成都品牌网站制作公司,成都营业执照年报网上怎么办理?  Linux虚拟化技术教程_KVMQEMU虚拟机安装与调优  如何在万网自助建站中设置域名及备案?  php在windows下怎么调试_phpwindows环境调试操作说明【操作】  如何在浏览器中启用Flash_2025年继续使用Flash Player的方法【过时】  香港网站服务器数量如何影响SEO优化效果?  LinuxCD持续部署教程_自动发布与回滚机制  Laravel如何实现API版本控制_Laravel API版本化路由设计策略  phpredis提高消息队列的实时性方法(推荐)  Microsoft Edge如何解决网页加载问题 Edge浏览器加载问题修复  Laravel如何配置中间件Middleware_Laravel自定义中间件拦截请求与权限校验【步骤】  香港服务器建站指南:免备案优势与SEO优化技巧全解析  C#如何调用原生C++ COM对象详解  Windows10如何删除恢复分区_Win10 Diskpart命令强制删除分区  jQuery validate插件功能与用法详解  如何快速生成凡客建站的专业级图册?  JavaScript中如何操作剪贴板_ClipboardAPI怎么用  Windows10怎样连接蓝牙设备_Windows10蓝牙连接步骤【教程】  b2c电商网站制作流程,b2c水平综合的电商平台?  Laravel如何与Pusher实现实时通信?(WebSocket示例)  西安市网站制作公司,哪个相亲网站比较好?西安比较好的相亲网站?  javascript中闭包概念与用法深入理解  Laravel Fortify是什么,和Jetstream有什么关系