-
我用 ThreadLocal 存当前登录用户,本以为线程私有绝不会串,结果某个用户偶尔会看到另一个用户的数据,因为在线程池里线程是复用的、用完没清的 ThreadLocal 残留给了下一个请求的深度复盘
我用 ThreadLocal 存当前登录用户(请求进来时 set、后续各层从 ThreadLocal 取,避免层层传参),想当然以为 ThreadLocal 线程私有、每个请求一个线程各存各的绝不会串。结果线上出了最可怕的 bug:偶发地某个用户页面上显示出了另一个用户的数据(订单、隐私),用户身份串了、是严重越权。排查才定位到线程池:Web 服务器用线程池处理请求、线程是复用的(处理完一个请求会…- 0
- 0
-
静态共享一个 SimpleDateFormat 给所有线程,高并发下偶发日期错乱甚至抛异常:一次线程不安全的深度排查与 DateTimeFormatter 正解
把 SimpleDateFormat 设成 static final 给所有线程共享,平时好好的,一上高并发就偶发日期错乱、甚至 NumberFormatException——SimpleDateFormat 内部用一个可变的 Calendar 暂存中间状态,并发 format/parse 时这个共享可变状态被互相覆盖,典型的数据竞争。本文从偶发难复现的现场讲起,剖析它非线程安全的根因,给出 Da…- 0
- 0
-
高并发下日期解析错乱:SimpleDateFormat 避坑复盘
这是一个典型的单机测试一切正常一上高并发就抽风的诡异 bug。我们一个接口会把字符串形式的日期解析成日期对象,平时跑得好好的,可一到流量高峰就开始偶发性地报错——有时抛 NumberFormatException,有时解析出一个莫名其妙根本不对的日期。最折磨人的是这个错是偶发的,绝大多数请求都正常只在并发高的时候零星出现几次,而我在本地单线程一遍遍测试同样的日期字符串怎么都复现不出来。排查到最后真…- 0
- 0
-
用户A看到了用户B的信息:ThreadLocal 串号避坑
这是我职业生涯里最惊出一身冷汗的一次线上事故。我们用 ThreadLocal 存当前登录用户的上下文——请求进来时在拦截器里把用户信息塞进 ThreadLocal、后续业务随时取当前是谁,用了很久一直稳稳的。可某天客服收到一个让所有人头皮发麻的投诉:一个用户登录后在自己的页面里看到的却是另一个陌生用户的姓名手机号订单,用户信息串了——这涉及隐私泄露性质极其恶劣。连夜拉日志排查才拼出全貌:Web 服…- 2
- 0
-
Java ThreadLocal 不 remove 引发的数据串号事故复盘:5 小时定位 + 5 种修法 + 8 条上下文纪律
Tomcat 线程池下 ThreadLocal 不 remove 导致用户上下文被复用,VIP 客户看到了别人的订单和手机号,P0 事故 5 小时停服、9 个客户数据合规事件。这篇完整复盘事故时间线、ThreadLocal 真实内存语义(value 强引用 + 线程池复用)、heap dump 分析、5 种修法(手动 remove / Scope try-with-resources / TTL …- 0
- 0
-
线上内存慢慢涨到 OOM:一次 ThreadLocal 内存泄漏的复盘
Web 服务运行三五天后内存只涨不落,最终 OOM,靠定时重启续命。堆 dump 显示对象被线程池线程通过 ThreadLocal 死死拽住。几天彻底搞清:ThreadLocal 存值原理、ThreadLocalMap 弱引用设计、线程池复用导致的泄漏与数据串号、finally remove 铁律与 TTL 跨线程传递。- 3
- 0
-
ThreadLocal 内存泄漏:网关服务每三天重启一次的真相
网关服务跑几天内存就涨满,频繁 Full GC、接口卡顿,只能定时重启。dump 堆发现一堆对象被 ThreadLocalMap 拽住——经典 ThreadLocal 泄漏;还查出线程池复用导致用户上下文串号。几天治理:set 配对 remove、收口到 Filter、封装 AutoCloseable 强制清理、InheritableThreadLocal 改 TransmittableThrea…- 0
- 0
ThreadLocal
幸运之星正在降临...
点击领取今天的签到奖励!
恭喜!您今天获得了{{mission.data.mission.credit}}积分
我的优惠劵
-
¥优惠劵使用时效:无法使用使用时效:
之前
使用时效:永久有效优惠劵ID:×
没有优惠劵可用!







