微型露台免安装绿色中文版
333M · 2025-10-11
原文来自于:zha-ge.cn/java/89
说来惭愧,这事儿一开始我真当是冷门八股,没想到最后差点被自己坑一把。事情是这样的:
前段时间改一个老同事写的多线程工具类,里面有段“神秘”的代码:
while (!stop) {
// 业务处理
// ...
Thread.sleep(0);
}
当时一脸懵逼:sleep(0)?这不是一行“啥也没干”的代码嘛?直接删了不香吗?但工程师经验告诉我——敢写到生产库里的很可能有坑,还是查查吧。结果这一查,不查不知道,一查差点出事……
有些人一提多线程就是 synchronized、volatile、乐观锁、死锁八股文狂背,但问他 Thread.sleep(0) 的“奥义”,基本翻车。查官方文档,Java 的 Thread.sleep(0)
声称让线程休眠“0ms”——理想状态下,好像什么都不会发生。但 JVM 江湖,从来都没这么简单。
梳理一下核心说法:
调皮点说,sleep(0) 就像班级里“假积极分子”,嘴上说“老师,我让让别人发言”,但其实一个人能不能下讲台,全看老师(操作系统/调度器)当不当回事。
你以为睡0毫秒就不会有副作用?呵!说多了都是泪。说两个“活生生”掉进的坑:
反正我亲自试了,跨平台整个不可控,简直比相亲还刺激。
讲真的,这种“看似无害”的小操作,说不定能引发团队血案。给大家总结下我的心得,省得以后再掉坑:
while (!stop) {
// ...
Thread.yield();
}
yield() 诚实得多,明确告诉调度器我主动让出时间片,至于是否安排别人,那就看 OS 乐意不乐意了。
写到这都有点盯花眼了。回头看看,这玩意只有没被“奇葩生产环境暴击”过的才敢嘲笑它无聊。从此见到 sleep(0),先三思,不要盲删——毕竟程序员的锅,锅锅相传,能避一点是一点吧!
最后一句,别自称多线程高手,连 sleep(0) 都没实验过。赶紧试试自己项目到底什么表现,别等 CPU 又炸了才想起来谁的鬼手笔~
—— 欠代码的夜,一个差点挖坑给自己填的憨批 Javaer