java中notify会报错_为什么在Java中object.wait()/notify()方法必须在持有锁的情况下才能执行?...

首先,如果在未持有对象锁的情况下调用object.wait()/notify(),直接会报错,JDK已经做好保护。

其次,为什么要这么设计?其实这是一种安全设计,为了防止wait错过notify。请看下面代码:

boolean wakeuped = false;

void dowait()

{

if(wakeuped)

return;

wait();

}

void wakeup()

{

wakeuped = true;

notify();

}

如果一个线程 执行dowait,另一个线程执行wakeup,在没有同步保护的情况下可能存在着这样的执行循序:

[wait thread ] if(wakeuped) return;//wakeuped is false;

[notify thread] wakeuped=true;// wakeuped is true

[notify thread] notify();//此时wait线程没有进入wait,

[wait thread ] wait();//wakuped is true,此时进入wait,而notify先于wait执行,此时wait将不会被唤醒。

在dowait和wakeup两个方法上加上同步锁保护,则可以保证不会出现上面的执行顺序。wakeup要么先于dowait执行,要么在dowait线程进入wait后才能执行。这样通过互斥锁来保证wait()/notify()之间的先后顺序,才能保证wait不会错过notify,从而导致wait线程一直挂着。

标签:wakeuped,object,线程,notify,wakeup,Java,dowait,wait

来源: https://blog.csdn.net/mycs2012/article/details/95523456

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值