wait、notify、notifyAll的理解与使用

基础知识
Java 中,可以通过配合调用 Object 对象的 wait() 方法和 notify() 方法或 notifyAll() 方法来实现线程间的通信。
在线程中调用 wait() 方法,将阻塞当前线程,直至等到其他线程调用了调用 notify() 方法或 notifyAll() 方法进行通知之后,当前线程才能从 wait() 方法出返回,继续执行下面的操作。

wait
该方法用来将当前线程置入休眠状态,直到接到通知或被中断为止。在调用 wait()之前,线程必须要获得该对象的对象监视器锁,即只能在同步方法或同步块中调用 wait()方法。调用 wait()方法之后,当前线程会释放锁。如果调用 wait()方法时,线程并未获取到锁的话,则会抛出 IllegalMonitorStateException异常,这是一个 RuntimeException。如果再次获取到锁的话,当前线程才能从 wait()方法处成功返回。

notify
该方法也要在同步方法或同步块中调用,即在调用前,线程也必须要获得该对象的对象级别锁,如果调用 notify()时没有持有适当的锁,也会抛出 IllegalMonitorStateException。
该方法任意从 WAITTING 状态的线程中挑选一个进行通知,使得调用 wait()方法的线程从等待队列移入到同步队列中,等待有机会再一次获取到锁,从而使得调用 wait()方法的线程能够从 wait()方法处退出。调用 notify 后,当前线程不会马上释放该对象锁,要等到程序退出同步块后,当前线程才会释放锁。

notifyAll
该方法与 notify ()方法的工作方式相同,重要的一点差异是:
notifyAll 使所有原来在该对象上 wait 的线程统统退出 WAITTING 状态,使得他们全部从等待队列中移入到同步队列中去,等待下一次能够有机会获取到对象监视器锁。

wait()与notify()操作会释放锁吗?
先说结论:
wait()会立即释放对象的锁
notify() 不会立即释放锁 当执行完同步代码块就会释放对象的锁

原文链接:https://blog.csdn.net/lizhengze1117/article/details/106342359

版权声明:程序员胖胖胖虎阿 发表于 2024年12月31日 下午2:26。
转载请注明:wait、notify、notifyAll的理解与使用 | 胖虎的工具箱-编程导航

相关文章

暂无评论

暂无评论...