为了账号安全,请及时绑定邮箱和手机立即绑定

lockObj

为什么 要用while循环 在讲互斥时候 while(energyBoxs[from]<amount){lockObj.wait()}

正在回答

1 回答

synchronize(lockObj) { <------- 这个获取锁操作会增加系统开销
    if(energyBoxs[from]<amount){
        return;
    }
    ...
}
之前的写法:每次成功获取锁之后,先条件判断,若为false,则返回,释放锁。
然后又要再次获取锁,这样操作会以很大的系统开销作为代价的。改成下面写法的话:
synchronize(lockObj) { 
    while(energyBoxs[from]<amount){
        lockObj.wait();
    }          
}
就是为了减小系统开销


0 回复 有任何疑惑可以回复我~
#1

笙__笙 提问者

为什么 不用if 判断一次 却用 while 判断很多次
2017-11-24 回复 有任何疑惑可以回复我~
#2

慕田峪3134475 回复 笙__笙 提问者

明白你说的了,你是不是想用下面这种写法,判断一次就好 synchronize(lockObj) { if(energyBoxs[from]<amount){ lockObj.wait(); } ... } 我个人认为是可以的
2017-11-24 回复 有任何疑惑可以回复我~
#3

笙__笙 提问者 回复 慕田峪3134475

嗯 是可以的 但是不明白 用while 很难理解 哈哈哈
2017-11-24 回复 有任何疑惑可以回复我~
#4

亚历山魈 回复 笙__笙 提问者

因为notifyAll()唤醒后选择WaitSet中的等待线程是随机选择的
2018-09-18 回复 有任何疑惑可以回复我~
查看1条回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信