使用Lock和Condition 替代 synchronized的 锁和 等待和唤醒

来源:互联网 发布:知善恶树英语 编辑:程序博客网 时间:2024/06/06 03:51
import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;class eggs{    //判断是否有鸡蛋    private boolean flag=false;    //第几个鸡蛋    private int sum=0;    Lock lock=new ReentrantLock();    //用当前一个锁 获取2个监视器 一个监视生产鸡蛋  一个监视出售鸡蛋    Condition con1=lock.newCondition();    Condition con2=lock.newCondition();    public void Eggs()    {        lock.lock();        try {            if(flag)                try {                    //this.wait();                    con1.await();                } catch (Exception e) {                    // TODO: handle exception                }            sum++;            System.out.println(Thread.currentThread().getName()+"生产.."+sum);            flag=true;            con2.signal();        }        finally {            lock.unlock();        }    }    public void Sale()    {        try {            lock.lock();            if(!flag)                try {                    //this.wait();                    con2.await();                } catch (Exception e) {                    // TODO: handle exception                }            System.out.println(Thread.currentThread().getName()+"...销售.."+sum);            flag=false;            con1.signal();        }        finally {            lock.unlock();        }    }}class Demo implements Runnable{    private eggs r;    private boolean f;//判断是生鸡蛋操作 还是销售操作    public Demo(eggs r,boolean f) {        // TODO Auto-generated constructor stub        this.r=r;        this.f=f;    }    public void run()    {        if(f)            while(true)            {                try {                    Thread.sleep(100);                } catch (Exception e) {                    // TODO: handle exception                }                r.Eggs();            }        else            while(true)            {                try {                    Thread.sleep(100);                } catch (Exception e) {                    // TODO: handle exception                }                r.Sale();            }    }}public class Main {    public static void main(String[] args) {        eggs e=new eggs();        Demo d1=new Demo(e,true);        Demo d2=new Demo(e,false);        Thread t1=new Thread(d1);        Thread t2=new Thread(d2);        t1.start();        t2.start();    }}

原创粉丝点击