通过使用reetrantlock和condition实现的有界缓存。
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
/**
* Created by hybian on 2017/4/18.
*/
public class ConditionBoundedBuffer<T> {
private int tail, head, count;
private final int BUFFER_SIZE;
private final T[] items;
protected final Lock lock = new ReentrantLock();
//条件谓词
private final Condition notFull = lock.newCondition();
private final Condition notEmpty = lock.newCondition();
public ConditionBoundedBuffer(int buffer_size) {
this.BUFFER_SIZE = buffer_size;
items = (T[])new Object[BUFFER_SIZE];
}
//阻塞直到notFull
public void put(T x) throws InterruptedException {
lock.lockInterruptibly();
try {
while (count == items.length)
notFull.await();
items[tail] = x;
if (++tail == items.length)
tail = 0;
++count;
notEmpty.signal();
}finally {
lock.unlock();
}
}
public T take() throws InterruptedException {
lock.lockInterruptibly();
try {
while (count == 0)
notEmpty.await();
T x = items[head];
items[head] = null;
if (++head == items.length)
head = 0;
--count;
notFull.signal();
return x;
}finally {
lock.unlock();
}
}
}