JUC的Condition注意事项

前言

在看Condtion时候总是感觉有点晕的感觉,总结一点别的文章没有提到的地方。

正文

作用:

Condition主要是为了代替Object 监视器方法(wait、notify 和 notifyAll)。Condition 将 Object 监视器方法(wait、notify 和 notifyAll)分解成截然不同的对象,以便通过将这些对象与任意 Lock 实现组合使用,为每个对象提供多个等待 set(wait-set)。其中,Lock 替代了 synchronized 方法和语句的使用,Condition 替代了 Object 监视器方法的使用。

注意点:

Condition的时候,是为了配合Lock使用而存在的。我们看一下声明和使用时候的代码就明白了。
声明代码:

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

通过上面的声明代码可以看出来,声明Condition实例的时候,一般都是使用lock实现来声明的。

使用代码:

public class ConditionTest1 {

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

    public static void main(String[] args) {

        ThreadA ta = new ThreadA("ta");

        lock.lock(); // 获取锁
        try {
            System.out.println(Thread.currentThread().getName()+" start ta");
            ta.start();

            System.out.println(Thread.currentThread().getName()+" block");
            condition.await();    // 等待

            System.out.println(Thread.currentThread().getName()+" continue");
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            lock.unlock();    // 释放锁
        }
    }

    static class ThreadA extends Thread{

        public ThreadA(String name) {
            super(name);
        }

        public void run() {
            lock.lock();    // 获取锁
            try {
                System.out.println(Thread.currentThread().getName()+" wakup others");
                condition.signal();    // 唤醒“condition所在锁上的其它线程”
            } finally {
                lock.unlock();    // 释放锁
            }
        }
    }
}

  从使用代码可以看出来,在使用condition.await()condition.signal()的时候,都需要有Lock.lock方法。在Javadoc上也提到了,如果在使用Condition的await()signal()方法(其它方法好像也是,没有确认)时,没有持有Condition相对应的锁(也就是生成Condition的锁)的话,就会抛出IllegalMonitorStateException异常。
  所以,await或signal操作,都是针对使用“生成Condtion的锁”的线程。

参考:

    原文作者:JUC
    原文地址: https://blog.csdn.net/hotdust/article/details/54933822
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞