s****s 发帖数: 628 | 1 public void withdraw(int amount) {
56 lock.lock();// Acquire the lock
57 try {
58 while (balance < amount) {
59 System.out.println("\t\t\tWait for a deposit")
60 newDeposit.await();
61 }
62
63 balance -= amount;
64 System.out.println("\t\t\tWithdraw " + amount +
65 "\t\t" + getBalance());
66 }
67 catch (InterruptedException ex) {
68 ex.printStackTrace();
69 }
70 finally {
71 // Release the lock
72 }
73 }
书上说:
What will happen if you replace the while loop in lines 59–60 with the
following if
statement?
if (balance < amount) {
System.out.println("\t\t\tWait for a deposit");
newDeposit.await();
}
The deposit task will notify the withdraw task whenever the balance changes.
(balance < amount) may still be true when the withdraw task is awakened.
Using the if statement, the withdraw task may wait forever.
我觉得无法理解为什么, while loop 变成 if 之后, withdraw就要wait forever??? |
z*******3 发帖数: 13709 | 2 while是持久性循环
只要条件成立,就一直执行下去
if是一次性判断,只判断一次
无论条件是否成立,都只执行一次
类似game里面的loop
你把所有的game loop的while改成if
就知道了,大部分动画基本上都停止不动了
【在 s****s 的大作中提到】 : public void withdraw(int amount) { : 56 lock.lock();// Acquire the lock : 57 try { : 58 while (balance < amount) { : 59 System.out.println("\t\t\tWait for a deposit") : 60 newDeposit.await(); : 61 } : 62 : 63 balance -= amount; : 64 System.out.println("\t\t\tWithdraw " + amount +
|
z*******3 发帖数: 13709 | 3 原来的意思类似
while(condition is true)
await
只要condition is true
就会一直await
一旦condition becomes false
就不在await,就会notify
而如果你改成if
那第一次if(condition is true)
就await
永远不会再次执行这个循环了
所以另外一个event driven的代码就停止不动鸟 |
s****s 发帖数: 628 | 4 谢谢回复.
如果是这样, 那么书上写得confusing了. 我把问题简单化一点.
withdraw(int amount){
while (balance < amount){ //如果用if???
await();
}
}
...
deposit(int amount){
balance += amount;
signaAll();
}
书上说deposit task 会通知withdraw task 当balance 一旦变化. (balance < amount
)可能依然是true当withdraw醒来的时候. 所以用if的话, withdraw会wait forever.
这里的问题是对sinalAll 和 await的理解:
1. 如果withdraw醒来,它依然会检查 (balance < amount)这个条件么? 如果(balance
< amount) 依然是true, withdraw是不是又要睡下去? 什么时候再醒?
2. 如果把 while (balance < amount)换成 if(balance < amount), 那么withdraw醒
来的时候, 不用再检查(balance < amount)这个条件, 不就可以往下执行了吗?
3.如果以上理解不对, 那应该是:
(1) while (balance < amount)
await();
withdraw 会不停的检查条件, 不符合就等. 过一会再检查. 那这个周期是多少?
(2)if(balance < amount)
await();
withdraw 只检查一次, 不符合就等. 然后等deposit task 叫醒, 叫醒了不就可以往下
执行了吗? 实在搞不懂了.
|
F****n 发帖数: 3271 | 5 deposit的钱就一定够了吗
用if 的话我deposit一分钱程序就crash了
用while回头再比较一边。
【在 s****s 的大作中提到】 : 谢谢回复. : 如果是这样, 那么书上写得confusing了. 我把问题简单化一点. : withdraw(int amount){ : while (balance < amount){ //如果用if??? : await(); : } : } : ... : deposit(int amount){ : balance += amount;
|
z*******3 发帖数: 13709 | 6 while后面其实不是睡下去,是拼命执行下去
一般在while{}里面会有一个Thread.sleep();这样的东西
如果不间断轮循的话,效率会很低
资源很快就会被占满,这个应该说的没有什么特别的
无非是while和if的区别而已,应该不用太过于纠结这一块
【在 s****s 的大作中提到】 : 谢谢回复. : 如果是这样, 那么书上写得confusing了. 我把问题简单化一点. : withdraw(int amount){ : while (balance < amount){ //如果用if??? : await(); : } : } : ... : deposit(int amount){ : balance += amount;
|
p*****2 发帖数: 21240 | 7 我看懂LZ的意思了。LZ看的什么书呀?我跟你的感觉一样。不会一直wait。 |
p*****2 发帖数: 21240 | 8
这个不需要用sleep吧?已经有wait了。
【在 z*******3 的大作中提到】 : while后面其实不是睡下去,是拼命执行下去 : 一般在while{}里面会有一个Thread.sleep();这样的东西 : 如果不间断轮循的话,效率会很低 : 资源很快就会被占满,这个应该说的没有什么特别的 : 无非是while和if的区别而已,应该不用太过于纠结这一块
|
p*****2 发帖数: 21240 | 9
为什么会crash呢?
【在 F****n 的大作中提到】 : deposit的钱就一定够了吗 : 用if 的话我deposit一分钱程序就crash了 : 用while回头再比较一边。
|
F****n 发帖数: 3271 | 10 不是crash, 是balance < 0
【在 p*****2 的大作中提到】 : : 为什么会crash呢?
|
|
|
p*****2 发帖数: 21240 | 11
balance<0为什么会crash?int可以有负数呀。
【在 F****n 的大作中提到】 : 不是crash, 是balance < 0
|
F****n 发帖数: 3271 | 12 我都没看后面的,assuming balance 不能小于0
【在 p*****2 的大作中提到】 : : balance<0为什么会crash?int可以有负数呀。
|
p*****2 发帖数: 21240 | 13
这个很难让他们crash吧?除非你把Integer给封装了。
【在 F****n 的大作中提到】 : 我都没看后面的,assuming balance 不能小于0
|
F****n 发帖数: 3271 | 14 万一有business code基于balance >= 0的assumption可不就crash了吗
【在 p*****2 的大作中提到】 : : 这个很难让他们crash吧?除非你把Integer给封装了。
|
p*****2 发帖数: 21240 | 15
这个有道理。不过这段代码应该不会吧。
【在 F****n 的大作中提到】 : 万一有business code基于balance >= 0的assumption可不就crash了吗
|
s****s 发帖数: 628 | 16 没有SLEEP. 我的CODE是直接COPY书上的.
【在 z*******3 的大作中提到】 : while后面其实不是睡下去,是拼命执行下去 : 一般在while{}里面会有一个Thread.sleep();这样的东西 : 如果不间断轮循的话,效率会很低 : 资源很快就会被占满,这个应该说的没有什么特别的 : 无非是while和if的区别而已,应该不用太过于纠结这一块
|
s****s 发帖数: 628 | 17 Introduction to java programming comprehensive version eighth edition (
daniel liang)
【在 p*****2 的大作中提到】 : 我看懂LZ的意思了。LZ看的什么书呀?我跟你的感觉一样。不会一直wait。
|
p*****2 发帖数: 21240 | 18
我没看这本书。不知道context,但是从你说的感觉它是错的。
【在 s****s 的大作中提到】 : Introduction to java programming comprehensive version eighth edition ( : daniel liang)
|
s****s 发帖数: 628 | 19 这本书据说口碑还行.
【在 p*****2 的大作中提到】 : : 我没看这本书。不知道context,但是从你说的感觉它是错的。
|
p*****2 发帖数: 21240 | 20
无所谓吧。不用扣那么细。再说了,notify这东西最好不要用。而且你工作中用到的可
能性几乎为零,除非是legacy code。
【在 s****s 的大作中提到】 : 这本书据说口碑还行.
|