根本区别在于锁的处理:sleep() 不释放锁且无需同步上下文,wait() 必须在 synchronized 块中调用并立即释放锁。

sleep() 和 wait() 的根本区别在哪?
一句话结论:sleep() 是让当前线程“打个盹”,不放锁、不依赖同步;wait() 是让当前线程“请假等通知”,必须在 synchronized 块里调用,且会立刻释放锁。
为什么 wait() 必须写在 synchronized 里?
因为 wait() 的语义是“我先放手这个锁,等别人喊我再抢回来”——没拿着锁就喊“我放手”,JVM 直接抛 IllegalMonitorStateException。这不是设计缺陷,而是强制你显式表达“我确实在保护共享状态”。
-
wait()调用前必须已进入该对象的 monitor(即已获得锁) -
sleep()完全不管锁的事,连对象都不需要,Thread.sleep(100)随处可写 - 常见错误:把
obj.wait()写在非同步块里 → 运行时报错,不是编译错
锁会不会被释放?这是最易踩的坑
写错地方,轻则逻辑卡死,重则死锁。关键看锁:
-
sleep():线程暂停,但锁纹丝不动。其他线程想进同一synchronized方法?等着。 -
wait():一执行就交出锁,别的线程立刻能进 —— 所以它常配合notify()/notifyAll()用,否则没人能唤醒它 - 反模式示例:
synchronized (lock) { Thread.sleep(1000); // 锁还在!别人进不来 lock.wait(); // 这才放手 }
怎么选?看你要解决什么问题
别背区别,看场景:
立即学习“Java免费学习笔记(深入)”;
- 要“延时执行”或“降低轮询频率” → 用
sleep()。比如每秒查一次数据库:Thread.sleep(1000) - 要“等某个条件成立”(如队列有数据、资源就绪)→ 用
wait()+notify()。比如生产者往队列塞完,notify()消费者 - 想带超时又不想依赖别人唤醒?
wait(5000)可以,5 秒后自动争锁继续;sleep(5000)则纯靠时间驱动
真正容易被忽略的是:两者都抛 InterruptedException,而很多开发者只 catch 却不 restore 中断状态(即没调 Thread.currentThread().interrupt()),这会让上层调度逻辑失效。










