线程通信2

来源:互联网 发布:paxos算法执行过程 编辑:程序博客网 时间:2024/06/08 02:54

使用Condition来控制线程通信:
如果程序不使用synchronized关键字来保证线程同步,而是直接使用Lock对象来保证同步,则系统中不存在隐式的同步监视器,也就不能使用wait(),notify(),notifyAll()方法进行线程通信了。

当使用Lock对象来保证同步时,java提供了一个Condition类来保持协调,使用Condition可以让那些已经得到Lock对象却无法继续执行的线程释放Lock对象,Condition对象也可以唤醒其他处于等待的线程。

import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;public class Account_2 {    private final Lock lock = new ReentrantLock();    private final Condition cond = lock.newCondition();    private String accountNo;    private double balance;    private boolean flag = false;    public Account_2(){}    public Account_2(String accountNo,double balance){        this.accountNo = accountNo;        this.balance = balance;    }    public double getBalance(){        return this.balance;    }    public void draw(double drawAmount){        lock.lock();        try {            if (!flag) {                cond.await();            }            else {                System.out.println(Thread.currentThread().getName()                        +" 取钱:"+drawAmount);                balance -= drawAmount;                System.out.println("账户余额为: "+balance);                flag = false;                cond.signalAll();            }        } catch (InterruptedException e) {            e.printStackTrace();        }        //使用finally来释放锁        finally{            lock.unlock();        }    }    public void deposit(double depositAmount){        lock.lock();        try {            if (flag) {                cond.await();            }            else {                System.out.println(Thread.currentThread().getName()                        +" 存款:"+depositAmount);                balance += depositAmount;                System.out.println("账户余额为: "+balance);                flag = true;                cond.signalAll();            }        } catch (InterruptedException e) {            e.printStackTrace();        }finally{            lock.unlock();        }    }}

await(),signal(),signalAll()类似于隐式同步监视器上的wait(),notify(),notifyAll()方法

对比隐式使用同步监视器不难发现,两个程序的逻辑基本相似,只是现在显示使用Lock对象来充当同步监视器,则需要使用Condition对象来暂停、唤醒指定线程。

0 0
原创粉丝点击