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
Vous devez vous connecter pour publier un commentaire.
Comme cela a été souligné, bornée BlockingQueue seul serait suffisant. Par exemple, le code suivant va faire ce que vous voulez:
Aussi, vous pouvez envisager de soutenir un temps de la version d'emprunter() à l'aide de BlockingQueue.poll().
Si vous n'avez pas bornée file d'attente de blocage structure de données, alors vous pouvez imposer un sémaphore sur le dessus d'une structure de données pour créer un thread safe et lié comportement.
Un peu modifié sjlee l'exemple; en permettant la création d'objets coûteux sur demande. Mon cas n'a pas besoin bloquant l'installation donc j'ai remplacées par des non-bloquant type de file d'attente. Comme un avantage, il n'y a pas besoin de traiter avec InterruptedExceptions.
Peut-être utiliser une pile au lieu d'une file d'attente? Cela donne une chance d'obtenir un objet qui est toujours assis dans le cache du processeur.
Utilisation de() à la place de poll(), et put() au lieu de la méthode add(). Le sémaphore est alors totalement redondante, de sorte que vous pouvez simplement se débarrasser de lui. Mais oui, ça a l'air bon.
Sa vaut rien qu'un ArrayBlockingQueue crée un objet lorsque vous prenez une entrée. Votre piscine ne sera pas réellement de sauvegarder les objets. Il ne pouvait aider si vos objets sont coûteux à créer.
Peut-être vous devriez vérifier que l'existence d'objets, c'est la seule chose que j'ai.
Edit: je n'ai pas lu le code avec soin. J'ai donc edtied le post un peu. 🙁
Ici est plus simple et complète de la piscine pour les derniers.
C'est mieux que le plus simple, et c'est simple.
De ici