黑马程序员技术交流社区
标题:
在JAVA API 中有一个内容池实例,为十么方法是protected,而不是private
[打印本页]
作者:
血马雄风
时间:
2015-8-24 08:54
标题:
在JAVA API 中有一个内容池实例,为十么方法是protected,而不是private
内容池设计
技术要求: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;
}
}
作者:
史柯
时间:
2015-8-24 12:54
因为他需要他的子类调用,如果是private就不能调用了
作者:
段燚涛
时间:
2015-8-24 13:01
为了让子类能使用啊!!
作者:
蓬头小道士
时间:
2015-8-24 14:05
private,protected两个权限修饰符,protected比private权限大,可以被调用。
作者:
kingkeykang
时间:
2015-8-25 01:04
同意楼上
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2