在 Java 中,**“While 循环空转”**通常指的是类似下面这种代码:
while (true) {
// 什么也不做,或只做极少事情
}
或者:
while (condition) {
// 空循环体
}
while (!ready) {
}
本意是“等 ready 变成 true”,但线程会:
这叫做 忙等待(busy waiting)。
boolean ready = false;
// 线程1
while (!ready) {
}
// 线程2
ready = true;
如果 ready 不是 volatile:
✅ 正确写法:
volatile boolean ready = false;
空转不会主动让出 CPU:
while (true) {
}
后果:
| 原因 | 说明 |
|---|---|
| 线程调度模型 | Java 线程映射到 OS 线程,空转不阻塞 |
| 没有阻塞调用 | 没用 wait / sleep / Lock |
| 可见性问题 | 变量未 volatile |
| 设计错误 | 用循环代替同步机制 |
wait / notifysynchronized (lock) {
while (!ready) {
lock.wait();
}
}
volatile + Thread.sleepwhile (!ready) {
Thread.sleep(10);
}
Lock + Conditionlock.lock();
try {
while (!ready) {
condition.await();
}
} finally {
lock.unlock();
}
CountDownLatch / CompletableFuture / BlockingQueue
极少数情况:
AtomicInteger 自旋)但:
❌ 业务代码中基本不应该写空转 while
Java 中 while 空转的本质是:用“不断占用 CPU”来等待条件,而不是“阻塞等待”。
如果你愿意,可以把你的具体代码贴出来,我可以帮你精确指出问题在哪、怎么改最合适。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。