《JAVA核心技术 卷一》例题12-4
条件对象代码示例
package practise3;
/**
* @version 2022年3月29日
*/
import java.util.Arrays;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class synch_Bank {
private double[] accounts;
private Lock bankLock;
private Condition sufficientFunds;
public synch_Bank(int n,double initiaBalance) {
accounts = new double[n];
Arrays.fill(accounts,initiaBalance);
bankLock = new ReentrantLock(); // 创建锁对象
sufficientFunds = bankLock.newCondition(); // 条件对象绑定锁对象
}
public void transfer(int from,int to,double amount) throws InterruptedException {
bankLock.lock();
try {
while(accounts[from] < amount) {
sufficientFunds.await(); // 当账户资金余额不足时休眠
}
System.out.print(Thread.currentThread());
accounts[from] -= amount;
System.out.printf(" %10.2f from %d to %d",amount ,from,to);
accounts[to] += amount;
System.out.printf(" Total Balance:%10.2f%n",getTotalBalance());
sufficientFunds.signalAll(); // 别忘了唤醒线程
}
finally {
bankLock.unlock();
}
}
private double getTotalBalance() {
bankLock.lock();
try {
double sum = 0;
for(double a : accounts) {
sum += a;
}
return sum;
}
finally {
bankLock.unlock();
}
}
public int size() {
return accounts.length;
}
}