在看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的锁”的线程。
参考:
【Java并发编程实战】—–“J.U.C”:ConditionJava多线程系列–“JUC锁”06之 Condition条件新闻热点
疑难解答