黑马程序员技术交流社区

标题: 在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