简单概述:
synchronized 的条件变量,是当条件不满足时进入 WaitSet 等待;ReentrantLock 的条件变量比 synchronized 强大之处在于支持多个条件变量
ReentrantLock 类获取 Condition 对象:public Condition newCondition()
Condition 类 API:
-
void await()
:当前线程从运行状态进入等待状态,释放锁 -
void signal()
:唤醒一个等待在 Condition 上的线程,但是必须获得与该 Condition 相关的锁。【因为这两个方法需要获得锁才可以使用】
使用流程:
-
await / signal 前需要获得锁
-
await 执行后,会释放锁进入 ConditionObject 等待
-
await 的线程被唤醒(或打断、或超时)去重新竞争 lock 锁
-
线程在条件队列被打断会抛出中断异常
-
竞争 lock 锁成功后,从 await 后继续执行
public static void main(String[] args) throws InterruptedException {
ReentrantLock lock = new ReentrantLock();
Condition c = lock.newCondition();
Thread t1 = new Thread(() -> {
lock.lock();
try {
c.await();
log.debug("1");
} catch (InterruptedException e) {
throw new RuntimeException(e);
} finally {
lock.unlock();
}
});
Thread t2 = new Thread(() -> {
lock.lock();
try {
log.debug("2");
c.signal();
}finally {
lock.unlock();
}
});
t1.start();
Thread.sleep(1000);
t2.start();
}