//需求:这个系统有两类线程,分别代表存款者和取款者。该体系要求存款者和取款者不断的重复存款、取款的操作,而且要求每当存款者将钱存入指定账户后,取款者就立即取出这笔钱。不允许存款者两次存款,也不允许取款者连续两次取款。
本系统有四个类:
1.银行账户Account; 2.取款线程Withdrawer;
3.存款线程; 4.测试类Test
在存取款过程中,区别于上文通过同步监视器的wait(),notifyAll()方法以及银行账户属性:state状态的判断以及改变来实现线程通信;次例通过Lock控制线程同步,Condition控制线程的协调运行。
加锁---->修改---->释放锁
注:次例可以只采用一个Condition对象实现同步存取款。采用两个不同的Condition对象,可以精确的唤醒特定线程,减少不必要的资源竞争和线程切换。
public class AccountLC {
private String accountNo;
private double balance;
private boolean state = true;// true-->can
deposit;false-->can withdraw.
private Lock lock = new ReentrantLock();
private Condition canDeposit =
lock.newCondition();
private Condition canWithdraw =
lock.newCondition();
public AccountL