概述
在单线程中调用某个方法,而方法中依赖对象的状态前置条件没有满足,那么这个条件将无法满足。然而在多线程中,一个线程依赖的对象状态的前置条件没有满足,另一个线程可能修改对象状态,从而使得前置条件满足。
多线程中对于依赖状态的操作一般是前置条件不满足,阻塞线程,当前置条件满足,唤醒线程继续执行。
在生产者-消费者的设计中经常有像BlockedQueue的有界的阻塞队列。我们下面就以有界阻塞队列来讲解状态依赖。
有界阻塞队列中需要有两个接口put
用于添加元素,take
接口获取元素处理。而put
的前置条件为队列未满,take
的前置条件为队列不为空。
内置条件队列
条件队列是它使得一组线程能够通过某种方式等待特定的条件为真,条件队列中的元素是一个个正在等待前置条件的队列。
每个对象可以作为一个条件队列,而wait
,notify
,notifyAll
接口构成了API。
那我们使用内置的条件队列来实现有界阻塞队列。
public class BoundedBlockedQueue<E> {
private final Object[] items;
private int takeIndex;
private int putIndex;
private int count;
public BoundedBlockedQueue(Object[] items) {
this.items = items;
}
public synchronized E take() throws InterruptedException {
while (count == 0)
wait();
return doTake();
}
private E doTake() {
final Object[] items = this.items;
@SuppressWarnings("unchecked")
E x = (E) items[takeIndex];
items[takeIndex] = null;
if (&#