wait、notify、notifyAll的理解与使用

打印 上一主题 下一主题

主题 914|帖子 914|积分 2742

基础知识
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

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

莫张周刘王

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表