8、JUC--Condition 控制线程通信

Condition

Condition 接口描述了可能会与锁有关联的条件变量。这些变量在用
  法上与使用 Object.wait 访问的隐式监视器类似,但提供了更强大的
  功能。需要特别指出的是,单个 Lock 可能与多个 Condition 对象关
  联。为了避免兼容性问题,Condition 方法的名称与对应的 Object 版
  本中的不同。
 在 Condition 对象中,与 wait、notify 和 notifyAll 方法对应的分别是
  await、signal 和 signalAll。
 Condition 实例实质上被绑定到一个锁上。要为特定 Lock 实例获得
  Condition 实例,请使用其 newCondition() 方法

使用Lock锁进行控制线程安全

继上一个工程的项目更改:

class Clerk1{
    private int product =0;
    
    //Lock锁
    private Lock lock = new ReentrantLock();
    //获取Condition对象
    private Condition condition = lock.newCondition();
    //进货
    public  void get(){
        //上锁
        lock.lock();
        try {
            while(product >=1){
                System.out.println("产品已满!");
                try {
                    //this.wait();
                    condition.await();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
                System.out.println(Thread.currentThread().getName()+":"+ ++product);
                //this.notifyAll();
                condition.signalAll();
        } finally {
            //解锁
            lock.unlock();
        }
    }
    
    //卖货
    public  void sale(){
        //上锁
        lock.lock();
        try {
            while(product <=0){
                System.out.println("产品卖完");
                try {
                    //this.wait();
                    condition.await();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
                System.out.println(Thread.currentThread().getName()+":"+ --product);
                //this.notifyAll();
                condition.signalAll();
        } finally {
            lock.unlock();
        }
    }
}

此时运行之后的结果:

原文地址:https://www.cnblogs.com/Mrchengs/p/10799854.html