在Java多线程编程中,wait()
会释放锁,而sleep()
不会释放锁。这一核心区别直接影响线程的协作效率和资源管理,是理解线程同步机制的关键。
-
锁的释放机制
wait()
方法调用后,线程会立即释放当前持有的对象锁,允许其他线程进入同步代码块。而sleep()
即使让线程休眠,仍保持锁的占有状态,其他线程无法获取锁,可能导致阻塞。例如,生产者-消费者模型中,消费者线程调用wait()
释放锁后,生产者才能继续向缓冲区添加数据。 -
使用场景与目的
wait()
设计用于线程间协作,需搭配notify()
/notifyAll()
使用,适用于条件等待的场景(如资源就绪前挂起)。sleep()
仅用于定时暂停线程执行,与锁无关,常见于延迟任务或节奏控制。 -
语法与调用限制
wait()
必须在同步代码块(如synchronized
方法或块)中调用,否则抛出IllegalMonitorStateException
;sleep()
是Thread
的静态方法,可在任意位置调用,只需捕获InterruptedException
。 -
线程状态与唤醒方式
wait()
使线程进入WAITING
状态,依赖外部唤醒;sleep()
进入TIMED_WAITING
状态,时间结束后自动恢复。若sleep()
期间持有锁,可能延长其他线程的等待时间。
选择sleep()
还是wait()
取决于是否需要保留锁资源。需线程协作时用wait()
,单纯暂停用sleep()
。错误使用可能导致死锁或资源浪费,务必结合场景谨慎选择。