状态依赖的类--JCIP C14.1读书笔记
[本文是我对Java Concurrency In Practice C14.1的归纳和总结. ?转载请注明作者和出处, ?如有谬误, 欢迎在评论中指正. ]?
java类库中包含许多状态依赖的类: 其中的某些方法只有满足特定的前置条件才能继续, 比如BlockingQueue的take方法, 只有队列不为空时take方法才能返回.
状态依赖的操作一般如下:
public class BoundedBuffer<V> extends BaseBoundedBuffer<V> {public BoundedBuffer(int size) {super(size);}public synchronized void put(V v) throws InterruptedException {// 当缓冲区已满时将线程挂起, 等待其他线程唤醒// 不给唤醒之后再次判断缓冲区是否已满while (isFull()) {wait();}doPut(v);// 操作完成后唤醒其他线程notifyAll();}public synchronized V take() throws InterruptedException {// 当缓冲区为空时将线程挂起, 等待其他线程唤醒// 被唤醒之后再次判断缓冲区是否为空while (isEmpty()) {wait();}V v = doTake();// 操作完成后唤醒其他线程notifyAll();return v;}}?
BoundedBuffer已经比较完美了, 相比于SleepyBoundedBuffer, 其具有更好的响应性, 更高的CPU效率以及更少的上下文切换.
?