内容池设计
技术要求:1、内容池的容量是有限的
2、允许多个线程同时反问内容池,可能线程数量大于内容池的容量
3、内容池的某个内容项被某个线程使用时,其它线程不能使用;而使用完后还可以被其它线程所使用
4、Semaphore与线程同步是无关的
技术要点:1、使用Semaphore维护可允许维护可访问内容池的线程数,该数也是内容池的容量
2、使用一个boolean数组标记其对内容池应位置上的内容项是否已被使用
3、synchronized实现线程同步
class Pool {
private static final MAX_AVAILABLE = 10;
private final Semaphore available = new Semaphore(MAX_AVAILABLE, true);
//获取
public Object getItem() throws InterruptedException {
available.acquire();
return getNextAvailableItem();
}
//释放
public void putItem(Object x) {
if (markAsUnused(x))
available.release();
}
// Not a particularly efficient data structure; just for demo
protected Object[] items = ...; //内容池
protected boolean[] used = new boolean[MAX_AVAILABLE];
//获取还没被使用的内容项,为什么不是使用private,线程可以从这里访问吧?
protected synchronized Object getNextAvailableItem() {
for (int i = 0; i < MAX_AVAILABLE; ++i) {
if (!used[i]) {
used[i] = true;
return items[i];
}
}
return null; // not reached
}
//复位已使用完的内容项
protected synchronized boolean markAsUnused(Object item) {
for (int i = 0; i < MAX_AVAILABLE; ++i) {
if (item == items[i]) {
if (used[i]) {
used[i] = false;
return true;
} else
return false;
}
}
return false;
}
}
|
|