// 下列三对操作的语义是相同的
// Condition.await() Object.wait()
// Condition.signal() Object.notify()
// Condition.signalAll() Object.notifyAll()
public class BlockedQueue<T> {
private static final int MAX_SIZE = 10;
// 可重入锁
private final Lock lock = new ReentrantLock();
// 条件变量:队列不满
private final Condition notFull = lock.newCondition();
// 条件变量:队列不空
private final Condition notEmpty = lock.newCondition();
// 队列实际存储:栈
private final Stack<T> stack = new Stack<>();
// 入队
public void enq(T t) {
// 先获得互斥锁,类似于管程中的入口
lock.lock();
try {
while (stack.size() >= MAX_SIZE) {
// 队列已满,等待队列不满,才可入队
notFull.await();
}
// 入队后,通知队列不空,可出队
stack.push(t);
notEmpty.signalAll();
} catch (InterruptedException ignored) {
} finally {
lock.unlock();
}
}
// 出队
public T deq() {
// 先获得互斥锁,类似于管程中的入口
lock.lock();
try {
while (stack.isEmpty()) {
// 队列已空,等待队列不空,才可出队
notEmpty.await();
}
// 出队后,通知队列不满,可入队
T pop = stack.pop();
notFull.signalAll();
return pop;
} catch (InterruptedException ignored) {
} finally {
lock.unlock();
}
return null;
}
}
while(条件不满足){wait();} ,这是MESA管程 特有 的
转载请注明出处:http://zhongmingmao.me/2019/04/27/java-concurrent-monitor/
访问原文「Java并发 -- 管程」获取最佳阅读体验并参与讨论