发布于2026-07-09 阅读(0)
扫一扫,手机访问
先说一个核心结论:Thread.sleep() 确实会让出 CPU,但它在锁面前寸步不让。这个差异正是多线程开发中最容易踩的坑之一。

调用 Thread.sleep(n) 之后,当前线程从 RUNNABLE 跳转到 TIMED_WAITING,JVM 会把它从 CPU 调度队列中踢出去。操作系统不再给它分配时间片,CPU 资源实打实地释放了,其他线程——不管要不要同一把锁——都有机会被调度执行。
Thread.sleep(0) 不是“不休眠”,而是主动触发调度器重评估;可能被立刻选中,也可能让出剩余时间片如果线程正握着 synchronized 锁或者 ReentrantLock,调用 sleep() 不会释放锁。其他线程要是想拿这把锁,只能眼巴巴等着休眠结束;如果不需要这把锁,那倒不受影响。
synchronized(obj) { doWork(); Thread.sleep(1000); } → 锁被霸占 1 秒,吞吐量直接往下掉lock.unlock() 之后 sleep,别在 lock 保护范围内磨蹭sleep() 是可以被 interrupt() 提前唤醒的,而且会抛出 InterruptedException。要是把这个异常随手忽略,上层就没法知道线程已经被中断了,可能导致资源泄漏或者优雅关闭失效。
Thread.currentThread().interrupt();sleep() 的本质是“固定延迟 + 主动让 CPU”,不是“等待条件”。场景用错了比语法用错了更难救。
wait()/notify()、CountDownLatch、Condition.await() 或者 LockSupport.park()sleep 是“我睡我的,锁照拿”;wait 是“我把锁交出去,等通知再抢”
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8