会
线程调用 wait()
方法时会释放其持有的锁,具体机制如下:
-
锁的释放
当一个线程调用
wait()
方法时,会立即释放当前持有的同步锁(如synchronized
块或方法中的锁),并将线程状态转为等待状态。此时其他持有该锁的线程可以获取锁并执行同步代码。 -
唤醒机制
其他线程可以通过
notify()
或notifyAll()
方法唤醒等待的线程。被唤醒的线程会重新竞争锁,只有成功获取锁后才能继续执行wait()
之后的代码。 -
异常处理
如果线程在等待期间被中断(如调用
interrupt()
方法),则会抛出InterruptedException
,此时线程会释放锁并终止等待状态。
注意事项
-
wait()
方法必须在同步代码块或同步方法中调用,否则会抛出IllegalMonitorStateException
。 -
notify()
只能唤醒一个等待线程,而notifyAll()
会唤醒所有等待线程。 -
与
sleep()
不同,wait()
需配合notify()
/notifyAll()
使用,否则可能导致其他线程无法获取锁。
示例代码
synchronized (lockObject) {
try {
lockObject.wait(); // 释放锁并等待
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
// 重新获取锁后执行的代码
}
通过以上机制,wait()
实现了线程间的协作与同步,避免了死锁等问题。