Java多线程面试题及答案_Java多线程面试题深度解析
发布时间 - 2026-01-24 00:00:00 点击率:次Java多线程面试重在实战经验而非背诵;wait()必须在synchronized块中调用,否则抛IllegalMonitorStateException;ConcurrentHashMap JDK8用CAS+单桶锁替代分段锁;线程池拒绝策略中CallerRunsPolicy更防雪崩;ThreadLocal内存泄漏因key弱引用而value强引用未及时清理。
Java多线程面试题不是考背诵,而是考你有没有真正写过多线程代码、踩过坑、调过问题。光知道 synchronized 和 volatile 的定义,答不对真问题。
为什么 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有什么关系


