如果程序不使用synchronized关键字来保证同步,而是使用Lock对象来保证同步,则系统中不存在隐式的同步监视器,也就不能使用wait() ,notify(),notifyAll()方法来进行线程通行了。
Condition
当使用Lock对象来保证同步时,Java提供了一个Condition类来保持协调。
condition实例的创建方法。
Lock lock = new ReentrantLock();
Condition condition = lock.newCondition();
condition的三个主要方法
改用condition类实现上篇博文的需求
public class Account{
//显式定义Lock对象
private final Lock lock = new ReentrantLock();
//获得指定Lock对象对应的condition
private final Condition condition =lock.newCondition();
//封装账户编号、账户余额两个成员变量
private String accountNo;
private double balance;
//标识账户中是否有存款
private boolean flag =false;
//取方法
public void draw(double drawAmount){
//加锁
lock.lock();
try{
//flag为假就代表没钱,取方法阻塞
if(!flag){
condition.await();
}
else{
//执行取钱操作
balance -=drawAmount;
System.out.println("账户余额为:"+balance);
//将标识账户是否有余额的旗标设置成false
flag = false;
//唤醒其他线程
condition.signalAll();
}
}
catch(InterruptedException ex){
ex.printStackTrace();
}
//使用finally来释放锁
finally{
lock.unlock();
}
}
//存方法
public synchronized void deposit(double depositAmount){
//加锁
lock.lock();
try{
//flag为真就代表有钱,存方法阻塞
if(!flag){
condition.await();
}
else{
//执行存钱操作
balance +=depositAmount;
System.out.println("账户余额为:"+balance);
//将标识账户是否有余额的旗标设置成rue
flag = true;
//唤醒其他线程
condition.signalAll();
}
}
catch(InterruptedException ex){
ex.printStackTrace();
}
//使用finally来释放锁
finally{
lock.unlock();
}
}
}