Condition实现等待、唤醒
Condition 接口是 JDK 1.5 开始提供的,用来实现线程间的等待与唤醒
Condition 的对象可以通过 Lock 对象的 newCondition() 方法创建
Condition 对象方法的调用必须在 Lock 对象的 lock() 和 unlock() 之间,否则会抛出异常 java.lang.IllegalMonitorStateException
Condition 的 await()、signal()、signalAll() 方法与 Object 的 wait()、notify()、notifyAll() 方法功能类似
Condition 接口的方法包括
//当前线程等待,直到收到唤醒的信号或者被中断 void await() throws InterruptedException; //当前线程等待,直到收到唤醒的信号,不可被中断 void awaitUninterruptibly(); //当前线程等待,直到收到唤醒的信号 或 被中断 或 指定的等待纳秒数超时 long awaitNanos(long nanosTimeout) throws InterruptedException; //当前线程等待,直到收到唤醒的信号 或 被中断 或 指定的时间超时 boolean await(long time, TimeUnit unit) throws InterruptedException; //当前线程等待,直到收到唤醒的信号 或 被中断 或 超过指定时间 boolean awaitUntil(Date deadline) throws InterruptedException; //唤醒一个等待中的线程 void signal(); //唤醒所有等待中的线程 void signalAll();
使用示例:
package constxiong.interview; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; /** * 测试 Lock Condition 的使用 * @author ConstXiong * @date 2019-12-09 11:46:17 */ public class TestLockCondition { public static void main(String[] args) throws InterruptedException { Lock lock = new ReentrantLock(); Condition condition = lock.newCondition(); for (int i = 0; i < 5; i++) { new Thread(() -> { try { lock.lock(); System.out.println(Thread.currentThread().getName() + " wait for the signal"); condition.await(); } catch (InterruptedException e) { e.printStackTrace(); } finally { lock.unlock(); } System.out.println(Thread.currentThread().getName() + " receive the signal, go on "); }).start(); } // 休眠5秒 Thread.sleep(5000); new Thread(() -> { try { // lock.lock(); System.out.println("signal all current lock's condition"); condition.signalAll(); } finally { lock.unlock(); } }).start(); } }
Condition 的实现
- Condition 接口的唯一实现类是同步器 AQS 的内部类 ConditionObject
- 每个 Condition 对象都包含着一个 FIFO 队列,拥有首节点(firstWaiter)和尾节点(lastWaiter)
- 队列中的每个节点都包含了一个在 Condition 对象上等待的线程引用
- await() 方法相当于同步队列的首节点(已获取锁)移动到 Condition 的等待队列中
- signal() 方法将会唤醒在等待队列中的节点,移到同步队列中
实现原理可参考:https://blog.csdn.net/qq_38293564/article/details/80554516
- Java 自学指南
- Java 面试题汇总PC端浏览【点这里】
- Java知识图谱
- Java 面试题汇总小程序浏览,扫二维码
所有资源资源汇总于公众号