-
静态共享一个 SimpleDateFormat 给所有线程,高并发下偶发日期错乱甚至抛异常:一次线程不安全的深度排查与 DateTimeFormatter 正解
把 SimpleDateFormat 设成 static final 给所有线程共享,平时好好的,一上高并发就偶发日期错乱、甚至 NumberFormatException——SimpleDateFormat 内部用一个可变的 Calendar 暂存中间状态,并发 format/parse 时这个共享可变状态被互相覆盖,典型的数据竞争。本文从偶发难复现的现场讲起,剖析它非线程安全的根因,给出 Da…- 0
- 0
-
我把 SimpleDateFormat 设成了静态共享变量,本地测试一切正常,一上线高并发就开始解析出乱七八糟的日期、甚至直接抛异常,我对着随机错误查了好几天的深度复盘
为了"性能",我把 SimpleDateFormat 设成了静态全局共享的常量,省去每次 new 的开销。本地、单测、小流量预发全都正常。可一上生产高并发,日志里就冒出乱七八糟的日期(年份变几万年后)、还频繁抛 NumberFormatException、ArrayIndexOutOfBoundsException,而且毫无规律、本地死活复现不出。盯着"高并发才出问题…- 0
- 0
-
Go 并发踩坑实录:一个共享 map 如何让整个服务瞬间崩溃
这次事故没有任何前兆:一个跑了大半年、从没出过岔子的 Go 服务,突然整个进程没了。登上机器翻日志,最后一行让我后背一凉——fatal error: concurrent map writes。不是 panic,是 fatal error,recover 写再多都拦不住一个字。根因朴素得讽刺:一个做本地缓存的普通 map,被好几个 goroutine 同时读写,平时并发不高一直没事,流量一冲高,两…- 2
- 0
-
Java 线程池实战:别用 Executors,七个参数与拒绝策略怎么配
一次大促压测,服务在流量爬到峰值前先 OOM 倒下,dump 一拉堆里塞满几十万个待处理任务,全卡在一个 Executors.newFixedThreadPool(50) 背后的无界队列里。那次之后我把 ThreadPoolExecutor 的七个参数当成七个必须亲手做的决策来理解:为什么禁用 Executors 工厂方法、队列为什么必须有界、核心线程数按 CPU 密集还是 IO 密集怎么算、四种…- 0
- 0
-
Python 并发模型选型:GIL、多线程、asyncio 与多进程到底怎么选
同事用 8 个线程跑纯 CPU 的图像处理,结果比单线程还慢——这是 Python 并发里最经典的困惑。从 GIL 这把全局锁讲起,把多线程、asyncio、多进程三套模型的脾性、坑和适用边界逐一摊开:IO 密集用线程或协程,CPU 密集只能靠多进程,asyncio 全程异步否则卡死事件循环,有 GIL 也照样要加锁。最后收口成一棵先问任务在等还是在算的选型决策树。- 0
- 0
-
C# async/await 踩坑实战:同步阻塞死锁、async void 与线程池饥饿
事情是从一个看起来人畜无害的 PR 开始的:一位同事在 ASP.NET Core 控制器里图省事,把异步调用写成了 var data = GetDataAsync().Result;,能编译、本地点一下也出结果,评审就这么过了——结果一上生产,这个接口在并发上来后开始大面积超时,最后整个应用线程池被拖垮、几乎所有请求一起卡死,根因就是这一行同步阻塞异步。那次之后我把这些年在 C# 异步上踩过的坑系…- 2
- 0
-
祖传 Java 服务大促崩盘复盘:从连接泄漏、线程不安全到现代 Java 工程化重构
6 人的后端团队把一套支撑电商交易与履约的核心 Java 服务,从一堆用手写 try-finally 管连接却在异常分支漏 close、把 SimpleDateFormat 声明成 static 让多线程共享、到处返回 null 又到处 if 判空、满屏命令式 for 循环、堆满 getter/setter 的可变 JavaBean、用 Date/Calendar 处理时间、手动下载 jar 拼 …- 11
- 0
-
从一套裸起 goroutine 不管生命周期加无缓冲 channel 发送方阻塞下游一慢就泄漏到 OOM 加全局 map 当缓存被多 goroutine 无锁并发读写高并发下 concurrent map fatal 崩进程加到处 if err != nil 直接 return 把错误上下文丢得一干二净加压根不传 context 超时不可控取消不传播加靠 interface{} 加类型断言硬凑运行时 panic 加用 GOPATH 加手动 vendor 锁不住依赖加靠 fmt.Println 调试的早期 Go 祖传微服务、核心是支撑公司订单聚合与支付回调的微服务功能上一直能用在并发量不大的那些年里默默聚合订单接收支付回调直到一次大促把并发推高一个数量级这套从骨子里就没认真对待过 goroutine 生命周期和并发安全的代码在最不该出事的那一夜集中爆炸、把我们打醒的是大促当晚的连环崩溃第一记重拳来自那些没人管死活的 goroutine 网关给每个请求裸起一个 goroutine 去并发调下游再用无缓冲 channel 把结果收回来可一旦下游变慢上游请求因超时提前 return 走了那个还在傻等着往无缓冲 channel 里发结果的 goroutine 就因为再也没有接收方而永远阻塞在那条发送语句上再也退不出去大促那晚下游一变慢这种泄漏的 goroutine 开始成千上万地堆积每个都死死攥着自己那份请求上下文和缓冲区不放内存一路飙升最终 OOM 进程被杀几乎同时第二记重拳砸下另一处用一个全局 map 当本地缓存好几个 goroutine 并发地读它写它却没有加任何锁大促高并发下并发的读和写终于真正撞在一起 Go runtime 检测到 concurrent map read and map write 直接抛出一个连 recover 都救不回来的 fatal error 把整个进程当场干掉 → 2026 现代 Go 工程体系 context 控制生命周期加超时取消加 errgroup 编排 goroutine 启动即规划退出 + RWMutex 加 sync.Map 保护并发安全加 go test -race 检测竞态写代码时就被揪出 + fmt.Errorf 的 %w 包装错误链加 errors.Is/As 精确判断错误带完整来龙去脉 + context.Context 贯穿调用链超时与取消沿链传播一处慢则一起及时放手 + generics 类型参数编译期类型安全一份逻辑适配多类型无运行时断言 + 规范 defer 紧跟获取显式生命周期循环内资源即时释放绝不泄漏句柄 + Go Modules 加 go.mod go.sum 锁定整棵依赖树任何机器拉出完全一致的版本 + slog 结构化日志分级别带字段可检索聚合告警 87 天战役复盘:8 个 P0 复盘 + 6 条工程哲学 + 7 个关键数字
5 人的后端团队 87 天把一套支撑公司订单聚合与支付回调的核心 Go 微服务,从一堆裸起 goroutine 不管生命周期、用全局 map 当缓存却不加锁、到处 if err != nil 直接 return 把错误上下文丢光、压根不传 context、靠 interface{} 加类型断言硬凑、用 GOPATH 加手动 vendor 锁不住依赖、靠 fmt.Println 调试的早期 Go 代…- 7
- 0
-
数据库唯一约束完全指南:从一次"明明查过了、用户却领到两张券"看懂并发插入与去重真相
2021 年我做一个电商活动的领券功能用户在活动页点一下领取系统给他发一张优惠券规则很简单一个用户一个活动只能领一张怎么保证只能领一张这件事我压根没多想我心里很省事地想插之前先查一下他领过没有没领过再插不就保证一人一张了吗第一版我做得很顺手先 SELECT 查这个用户在这个活动里有没有券查出来是 0 就 INSERT 一张查出来大于 0 就告诉他已经领过了就完事了本地开发时真不错我点一下领券成功再…- 2
- 0
-
Java 线程池完全指南:从一次线上 OOM 看懂七个核心参数怎么配
2022 年我维护一个电商订单处理服务,某次大促流量上来十几分钟服务就 OOM 崩了,重启又崩。导出 heap dump 一看堆里躺着几十万个待执行任务对象全堆在同一个队列里,顺着追到一行没多想的代码 Executors.newFixedThreadPool(20)——它背后是一个没有容量上限的队列,20 个线程处理不过来潮水般的订单任务被这个无底洞照单全收直到把堆内存塞爆。那一刻才意识到我从来没…- 4
- 0
-
分布式锁完全指南:Redis 分布式锁的正确打开方式
一场秒杀活动让我栽了个跟头:商品库存 100 件,扣库存那段我特意加了锁 —— synchronized 把"查库存、判断够不够、扣减"三步整个包住,自觉绝不可能超卖。活动结束运营找来:卖出去 103 件。代码翻了十几遍 synchronized 明明白白包在那里逻辑没错,直到看了一眼部署架构图才一身冷汗:服务部署了 3 台机器 = 3 个独立 JVM 进程,synchroni…- 2
- 0
-
一个共用线程池拖垮全站:线程池隔离与参数调优实录
商品详情服务并行调 5 个下游,共用一个线程池。推荐服务抖动 RT 涨到 3s,十分钟全站接口 503。一周治理:有界队列 + 按下游隔离 5 个线程池(舱壁模式)+ 任务超时 + Resilience4j 熔断 + 动态线程池 + 监控告警。下游再抖动,影响圈死在单业务内。- 0
- 0
并发编程
幸运之星正在降临...
点击领取今天的签到奖励!
恭喜!您今天获得了{{mission.data.mission.credit}}积分
我的优惠劵
-
¥优惠劵使用时效:无法使用使用时效:
之前
使用时效:永久有效优惠劵ID:×
没有优惠劵可用!












