sleep()不释放锁,wait()释放锁;二者均让出cpu;sleep()自动唤醒,wait()需notify唤醒且必须在synchronized中调用。

sleep() 和 wait() 都会让线程暂停执行,但它们在释放 CPU 资源和对象锁上的行为完全不同——这是多线程编程中最容易出错的关键点之一。
是否释放对象锁:核心区别
sleep() 不释放任何锁。即使当前线程正持有 synchronized 块或方法的锁,调用 sleep() 后仍牢牢占着这把锁,其他线程无法进入同一同步区域。
wait() 必须在 synchronized 内调用,且一执行就会立即释放当前持有的对象锁,让其他线程有机会获取并执行同步代码。
- sleep() → 持锁睡觉(别人进不了临界区)
- wait() → 放锁等待(别人可以立刻进来)
是否释放 CPU 执行权:两者一致
二者都会使线程从 RUNNING 状态变为阻塞状态(BLOCKED 或 WAITING),主动让出 CPU,不占用处理器时间。
注意:不是“不工作”,而是“不运行”;系统会把 CPU 分配给其他就绪线程。
AI 舌诊面诊问诊医疗系统 + 诊疗商城系统源码是一套结合 AI 辅助诊断与商品转化的健康类程序,基于浩创云、ThinkPHP(PHP)开发,支持微信服务号与 H5 端,适合做中医舌诊面诊问答、健康建议推送以及配套诊疗商品的运营。
- sleep(500):暂停 500ms,期间不抢 CPU,但锁还在手上
- wait(500):暂停至少 500ms,期间既不抢 CPU,也把锁交出去了
唤醒机制与使用约束
sleep() 是时间驱动的:指定毫秒数后自动恢复为 RUNNABLE,无需外部干预。
wait() 是事件驱动的:必须由另一个线程调用同一对象上的 notify() 或 notifyAll() 才能被唤醒;超时参数(如 wait(500))只设下限,实际唤醒时间还取决于锁竞争和调度延迟。
- wait() 只能在 synchronized 方法或块中调用,否则抛 IllegalMonitorStateException
- sleep() 是 Thread 的静态方法,哪里都能用,但必须处理 InterruptedException
- wait() 属于 Object 类,所有对象都有;sleep() 属于 Thread 类,是“谁调用、谁休眠”
典型误用场景提醒
想让线程等某个条件成立,却用了 sleep() —— 锁没放,别的线程改不了共享状态,自己睡醒也等不到结果。
想暂停一下再继续干活,却用了 wait() —— 没配 notify,线程永远卡在等待池里。
- 轮询+sleep:适合简单延时,比如重试间隔
- 条件等待+wait/notify:适合协作场景,比如生产者-消费者










