html中wait的作用,深入理解wait/notify/notifyAll的作用

notify: 唤醒在监视器对象上等待的单个线程,此时调用该方法的代码继续执行。

notifyAll: 唤醒在监视器对象上等待的所有线程,此时调用该方法的代码继续执行。

第一、为什么会有wait/notify/notifyAll这几个方法?

(1) wait/notify/notifyAll是为了避免轮询(尝试执行)带来的性能损失,这句话是什么意思?看下面的讲解:

为了说清道理,我们用“图书馆借书”这个经典例子来作解释。

在简单的synchrnozed 同步机制下,李四如果想借,先要去图书馆查看书有没有还回来。

李四是个心急的人,他每天都去图书馆查;而张三看书看得慢,过了半个月才把书还回来,

结果李四在这半个月里全都白跑了,浪费了不少交通车费。

而如果使用wait/notify机制,李四就不用白忙了。

他第一次去图书馆时发现书已借走,就回家静静等待(wait);

张三把书还掉后,通知(notify)李四,李四去图书馆拿书即可。整个过程中,李四没有白跑,没浪费钱。

书 ---- 临界资源,需互斥地访问

张三,李四 ---- 两个竞争的线程

坐车去图书馆查书 ---- 轮询

车费 ---- CPU空间

等待 ---- wait

通知下一个借书者 ---- notify

也就是说,若使用简单的synchonized机制实现互斥,会导致线程主动发起轮询,若N次轮询没有成功,就产生了N次的CPU空间浪费;

如果加上了 wait/notify机制,就可以避免这些无谓的轮询,节省CPU的消耗。

(2) wait/notify/notifyAll可以控制线程执行与不执行。

第二、为什么wait/notify/notifyAll方法一定要写在synchronized里面呢?

因为第一点已经说了wait/notify/notifyAll的作用是为了避免轮询带来的性能损失,

而产生轮询的条件是多个线程对同一个资源进行操作。

第三、为什么wait/notify/notifyAll方法定义在Object类里面呢?

因为wait/notify/notifyAll必须写在synchronized里面,而synchronized的对象锁可以是任意对象,

所以wait/notify/notifyAll方法定义在Object类里面呢。

调用wait/notify/notifyAll方法的对象,必须和synchronized()的对象锁一致。

标签:notifyAll,轮询,李四,线程,notify,wait

来源: https://blog.csdn.net/reed1991/article/details/53782250

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值