标签:
@ ThreadSafe public abstract class BaseBoundedBuffer<E> { @GuardeBy( "this" ) private final E[] buf; @GuardeBy( "this" ) private int tail; @GuardeBy( "this" ) private int head; @GuardeBy( "this" ) private int count; protected BaseBoundedBuffer( int capacity) { this .buf = (E[]) new Object[capacity]; } protected synchronized final void doPut(E E) { buf[tail] = E; if (++tail == buf.length) { tail = 0; } ++count; } protected synchronized final E doTake() { E E = buf[head]; buf[head] = null ; if (++head == buf.length) { head = 0; } --count; return E; } public synchronized final boolean isFull() { return count == buf.length; } public synchronized final boolean isEmpty() { return count == 0; } }
@ ThreadSafe public class GrumpyBoundedBuffer<V> extends BaseBoundedBuffer<V> { public GrumpyBoundedBuffer( int size){ super (size); } public synchronized void put(V v){ if (isFull()){ throw new BufferFullException (); } doPut(v); } public synchronized V take(){ if (isEmpty()) throw new BufferEmptyExeption (); return doTake(); } }
while (true ){ try { V item = buffer.take(); // 对于item运行一些操作 break ; } catch (BufferEmptyException e) { Thread. sleep(SLEEP_GRANULARITY ); } }
@ ThreadSafe public class SleepyBoundedBuffer<V> extends BaseBoundedBuffer<V> { public SleepyBoundedBuffer( int size) { super (size); } public void put(V v) throws InterruptedException{ while (true ){ synchronized (this ){ if (!isFull()){ doPut(v); return ; } } Thread.sleep(SLEEP_GRANULARITY); } } public V take() throws InterruptedException{ while (true ){ synchronized (this ){ if (!isEmpty()){ return doTake(); } } Thread.sleep(SLEEP_GRANULARITY); } } }
@ ThreadSafe public class BoundedBuffer<V> extends BaseBoundedBuffer<V> { // 条件谓词:not-full (!isFull()) // 条件谓词:not-empty (!isEmpty()) public BoundedBuffer( int size) { super (size); } // 堵塞并直道:not-full public synchronized void put(V v) throws InterruptedException{ while (isFull()){ wait(); } doPut(v); notifyAll(); } // 堵塞并直道:not-empty public synchronized V take() throws InterruptedException{ while (isEmpty()){ wait(); } V v = doTake(); notifyAll(); return v; } }
. 在一个循环中调用wait。
. 确保使用与条件队列相关的锁来保护构成条件谓词的各个状态变量。
. 当调用wait、notify或notifyAll等方法时。一定要持有与条件队列相关的锁。
. 在检查条件谓词之后以及開始运行对应的操作之前,不要释放锁。
《Java并发编程实战》第十四章 构建自己的同步工具定义 札记
标签:
原文地址:http://www.cnblogs.com/mengfanrong/p/5030032.html