public class BoundedBuffer<E>{
private final Semaphore availableItems,availableSpaces;
private final E[] items;
private int putPosition = 0,takePosition = 0;
public BoundedBuffer(int capacity){
availableItems = new Semaphore(0);
availableSpaces = new Semaphore(capacity);
items = (E[]) new Object[capacity];
}
public boolean isEmpty(){
return availableItems.availablePermits() == 0;
}
public boolean isFull(){
return availableSpaces.availablePermits() == 0;
}
public void put(E x) throws InterruptedException{
availableSpaces.acquire();
doInsert(x);
availableItems.release();
}
public E take() throws InterruptedException{
availableItems.acquire();
E item = doExtract();
availableSpaces.release();
return item;
}
private synchronized void doInsert(E x){
int i = putPosition;
items[i] = x;
putPosition = (++i==items.length)?0:i;
}
private synchronized E doExtract(){
int i = takePosition;
E x = items[i];
items[i] = null;
}
}
基于信号量的有界缓存
猜你喜欢
转载自blog.csdn.net/weixin_37632716/article/details/119220591
今日推荐
周排行