1. 什么是显示条件
显示条件在不同上下文也可以被称为:条件变量、条件队列、条件
- 锁用于解决竞态条件问题,条件是线程间的协作机制
- 显示锁与
synchronized
相对应,显示条件与wait/notify
对应 wait/nofity
与synchronized
配合使用,显示条件与显示锁配合使用
条件与锁相关联,创建条件变量需要通过显示锁。
Lock
接口定义了创建方法:Condition newCondition()
Condition
表示条件变量,是一个接口
与
wait/notify
相比,可以支持多个条件队列,代码更为易读高效
2. Condition
的定义是
1 | public interface Condition { |
3. await()
方法的基本使用
- 一般而言,与
Object
的wait()
方法一样,调用await()
方法前需要先获取锁。如果没有锁,会抛出IllegalMonitorStateException
异常 await()
在进入等待队列后,会释放锁,释放 CPU。当其他行程将它唤醒后,或等待超时后,或发生中断异常后,它都需要重新获取锁,获取锁后,才会从await()
方法中退出
4. 写一个使用显示条件进行协作的 Demo
1 | //一个线程启动后,在执行一项操作前,等待主线程给它指令,收到指令后才执行 |
5. 写一个使用显示锁/条件实现的阻塞队列(生产者/消费者) Demo
1 | //wait/notify 的局限是它只能有一个条件等待队列,分析等待条件也很复杂 |
- 清晰易读,同时避免了不必要的唤醒和检查,提高了效率
- Java 并发包中的类
ArrayBlockingQueue
就采用了类似的方式实现