在Java多线程编程中,wait()
会释放当前线程持有的锁资源,而sleep()
不会释放锁。这一核心区别直接影响线程协作与资源调度的效率:wait()
适用于线程间通信的场景,主动让出锁以允许其他线程操作共享资源;sleep()
仅暂停线程执行,保持锁的独占性。
-
锁的释放行为
wait()
:调用后立即释放对象锁,使其他线程能进入同步代码块。例如,在生产者-消费者模型中,消费者调用wait()
释放锁,生产者才能添加数据并唤醒消费者。sleep()
:线程休眠期间保持锁,其他线程无法获取锁。若线程A持有锁并调用sleep(2000)
,线程B需等待2秒后才能竞争锁。
-
使用条件与唤醒机制
wait()
必须在同步代码块(如synchronized
)中调用,依赖notify()
或notifyAll()
唤醒。未设置超时则无限等待。sleep()
可独立调用,无需同步块,通过时间参数自动唤醒,或通过interrupt()
强制中断。
-
设计意图与典型场景
wait()
用于线程协作,如等待条件满足(如队列非空)。释放锁避免资源死锁。sleep()
用于延迟执行或模拟耗时操作(如动画帧间隔),不涉及资源竞争时使用。
总结:选择sleep()
还是wait()
取决于是否需要释放锁资源。需线程协作时用wait()
,单纯暂停线程用sleep()
,错误使用可能导致性能瓶颈或死锁。