// Not a particularly efficient data structure; just for demo protected Object[] items = of(1, 2, 3, 4, 5); protectedboolean[] used = newboolean[MAX_AVAILABLE];
// 获取可用对象 protectedsynchronized Object getNextAvailableItem(){ for (int i = 0; i < MAX_AVAILABLE; ++i) { // 如果未被使用,设置为true表示已经被使用 if (!used[i]) { used[i] = true; return items[i]; } } // not reached returnnull; }
// 释放许可 protectedsynchronizedbooleanmarkAsUnUsed(Object item){ for (int i = 0; i < MAX_AVAILABLE; ++i) { if (item == items[i]){ // 如果已经被使用,设置为false表示释放 if (used[i]){ used[i] = false; returntrue; } else { returnfalse; } } } returnfalse; }
publicstaticvoidmain(String[] args)throws InterruptedException { int N = 10;
Pool pool = new Pool(); // 模拟使用线程池 for (int i = 0; i < N; i++) { // 由于permit大小设置为5,acquire()到第5个时 // 如果未释放,线程将被阻塞 if (i == 5){ Thread.sleep(5000); System.out.println("Semaphore达到限制,无可用permit,需要release\n");