Il seguente lotto di oggetti di base funziona? Ne ho uno più sofisticato basato sulla stessa idea (cioè mantenendo sia un semaforo che un BlockingQueue). La mia domanda è: ho bisogno sia di Semaphore che di BlockingQueue? Ho ragione che non ho bisogno di fare alcuna sincronizzazione?Questo pool di oggetti Java di base funziona?
import java.util.Collection;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.Semaphore;
public final class Pool<T> {
private final BlockingQueue<T> objects;
private final Semaphore permits;
public Pool(Collection<? extends T> objects) {
// we have as many permits as objects in our pool:
this.permits = new Semaphore(objects.size());
this.objects = new ArrayBlockingQueue<T>(objects.size(), false, objects);
}
public T borrow() {
this.permits.acquireUninterruptibly();
// we have a permit, so there must be one in there:
return this.objects.poll();
}
public void giveBack(T object) {
this.objects.add(object);
this.permits.release();
}
}
Qual è il motivo che state facendo da soli? Apache Commons Pool fa questo sullo scaffale. – skaffman
Che cosa ApacheCommonsPool fornisce che non sia un blockingQueue? Inserisce una grande libreria per definire un ampio set di interfacce "standard" quando un java.util.concurrent.BlockingQueue supporta già tutte le operazioni definite. – bhan
@skaffman puoi aiutare http://stackoverflow.com/questions/43860936/create-objects-in-genericobjectpool – Tony