A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

内容池设计

技术要求: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;
   }

}

4 个回复

倒序浏览
因为他需要他的子类调用,如果是private就不能调用了
回复 使用道具 举报
为了让子类能使用啊!!
回复 使用道具 举报
private,protected两个权限修饰符,protected比private权限大,可以被调用。
回复 使用道具 举报
同意楼上
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马