wait会释放锁而sleep不会:wait在synchronized块中调用,释放当前对象锁并进入等待队列,需notify唤醒后竞争锁;sleep则始终持有锁,仅暂停执行,无需同步环境。

最核心的区别就一条:wait 会释放锁,sleep 不会。
wait 释放锁,其他线程能立刻抢到
调用 wait() 的瞬间,当前线程就把正在持有的对象锁交出去了。它进入该对象的等待队列,不再占用锁资源。此时其他线程可以马上进入 synchronized 块执行逻辑。
- 必须在 synchronized 块或方法里调用,否则抛 IllegalMonitorStateException
- 释放的是“当前 synchronized 锁定的那个对象”的锁,不是所有锁
- 被 notify() 唤醒后,线程先进入锁池竞争锁,拿到锁才继续执行
sleep 抱着锁睡觉,谁也别想动
Thread.sleep() 只是让当前线程暂停执行,但锁还牢牢攥在手里。哪怕睡 10 秒,其他线程也只能干等,无法进入同一把锁保护的同步代码块。
- 不需要 synchronized 环境,任何地方都能调
- 锁不释放,就可能造成不必要的阻塞,甚至拖慢整体并发效率
- 时间一到自动恢复,不依赖其他线程协作
为什么这个差异特别关键
误用 sleep 替代 wait 是常见陷阱。比如在生产者-消费者中,消费者发现缓冲区为空,用 sleep(100) 轮询——既浪费 CPU,又无法被生产者及时唤醒;而用 wait(),生产者 notify() 后消费者立刻响应,锁也早已释放,生产者能顺利写入。
一句话记住:sleep 是线程自己歇会儿,锁不撒手;wait 是线程主动让位,等别人喊它开工。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











