JUC-8.Condition线程通信

1. 线程通信

上节讲的虚假唤醒,使用的是内置锁synchronized,那么我们使用同步锁(显示锁)Lock其实也一样达到效果。
我们知道,内置锁通过wait()notify()notifyAll()进行线程间通信。同步锁也一样是否一样可以进行通信呢?

1.1 显示锁Condition线程通信

Contion接口描述了可能会与锁有关联的条件变量。单个Lock可能与多个Condition对象关联,在Contiion中与
wait、notify、notifyAll相对的方法是await、signal、signalAll。Lock实例newContiion方法获取Contiion。

那么上节中的案例就改成了如下:

class Clerk {
    private int product = 0 ;

    private Lock lock = new ReentrantLock();
    private Condition condition = lock.newCondition();

    //进货
    public void get() {
        lock.lock();
        try {
            //修改库存为1
            while (product >= 1) {
                System.out.println("产品已满!");
                try {
                    condition.await();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            //去掉else
            System.out.println(Thread.currentThread().getName() + " : " + ++product);
            condition.signalAll();
        } finally {
            lock.unlock();
        }
    }

    //卖货
    public void sale() {
        lock.lock();
        try {
            while (product <= 0) {
                System.out.println("没货了!");
                try {
                    condition.await();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            //去掉else
            System.out.println(Thread.currentThread().getName() + " : " + --product);
            condition.signalAll();
        } finally {
            lock.lock();
        }
    }
}
    原文作者:JUC
    原文地址: https://blog.csdn.net/xbliu564/article/details/79521721
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞