「Core Java」中有一個示例,它將資金從一個賬戶轉移到另一個賬戶。我不知道什麼是條件的有用性?在這本書中,它告訴我們:爲什麼要使用條件以及Blocked和Waiting之間的區別
如果我們只是鎖定和等待沒有條件,它得到一個僵局:
private final double[] accounts;
private Lock bankLock;
private Condition sufficientFunds;
public void transfer(int from, int to, int amount) {
bankLock.lock();
try {
while (accounts[from] < amount) {
// wait...
}
// transfer funds . . .
} finally {
bankLock.unlock();
}
}
現在,我們該怎麼做的時候沒有足夠的錢在賬戶中?我們 等到其他線程增加資金。但是這個線程只有 獲得了獨家訪問
bankLock
,所以沒有其他線程有一個存款的機會。當呼叫
sufficientFunds.await();
當前線程現在被停用,並給出了鎖。這可讓 在另一個線程中,我們希望可以增加帳戶餘額。
Lock
鎖碼,條件放棄鎖,但我不知道什麼是條件,爲什麼不只是當錢不夠時簡單地解鎖塊? 線程狀態阻塞和等待有什麼區別? block:線程無法運行; 等待:線程無法運行。 有什麼不同?
另一個問題:
while (accounts[from] < amount) {
...
sufficientFunds.await();
爲什麼不寫if
?
if (accounts[from] < amount) {
...
只問一個問題中的一個問題。如果您有兩個問題,請提出兩個問題。如果您在一個問題中有多個問題,則無法確定什麼是好答案。 –