Ce pool d'objets Java de base fonctionne-t-il?

La suite de base de l'objet de la piscine de travail? J'en ai une plus sophistiquée basée sur la même idée (c'est à dire maintenir à la fois un Sémaphore et un BlockingQueue). Ma question est ai - je besoin à la fois de Sémaphore et BlockingQueue? Suis-je en droit que je n'ai pas besoin de faire une synchronisation?

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();
    }
}

source d'informationauteur looeeese