前言
在看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的锁”的线程。
参考: