Как уже указывалось, одной ограниченной BlockingQueue было бы достаточно. Например, следующий код будет делать то, что вы хотите:
import java.util.Collection;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
public final class Pool<T> {
private final BlockingQueue<T> objects;
public Pool(Collection<? extends T> objects) {
this.objects = new ArrayBlockingQueue<T>(objects.size(), false, objects);
}
public T borrow() throws InterruptedException {
return this.objects.take();
}
public void giveBack(T object) throws InterruptedException {
this.objects.put(object);
}
}
Кроме того, вы можете рассмотреть возможность поддержки синхронизированной версии loan () с использованием BlockingQueue.poll ().
Если у вас не было структуры данных с ограниченной блокирующей очередью, то вы можете наложить семафор поверх любой структуры данных, чтобы создать потокобезопасное и связанное поведение.