¿Existe alguna implementación de la cola de bloqueo que garantice la operación fair take() si varios consumidores están eliminando elementos de la misma cola? Comprobé LinkedBlockingQueue, LinkedTransferQueue y parece que ambos son injustos. ArrayBlockingQueue proporciona una operación justa pero limitada.¿Hay alguna cola de bloqueo de la feria (ilimitada) en java?
Respuesta
política de imparcialidad se puede especificar para SynchronousQueue:
una cola construido con equidad establece a verdaderas subvenciones hilos de acceso en FIFO fin
Al mirar el javadoc para esa clase me hace reír. Por ejemplo clear no hace nada – Woot4Moo
@ Woot4Moo claramente (juego de palabras no intencionado) no entiendo cómo funciona esa clase - no tiene capacidad en absoluto por lo que no se puede borrar. –
@Jed claramente no encuentras el humor al documentar algo que no hace nada. – Woot4Moo
Podemos implementar una ilimitada cola de bloqueo justo utilizando una cola ilimitada como la cola ConcurrentLinked y un semáforo justo. La siguiente clase no implementa todos los métodos desde la interfaz BlockingQueue, sino solo algunos con fines de demostración. El método main() se escribe solo como prueba.
public class FairBlockingQueue<T> {
private final Queue<T> queue;
private final Semaphore takeSemaphore;
public FairBlockingQueue() {
queue = new ConcurrentLinkedQueue<T>();
takeSemaphore = new Semaphore(0, true);
}
public FairBlockingQueue(Collection<T> c) {
queue = new ConcurrentLinkedQueue<T>(c);
takeSemaphore = new Semaphore(c.size(), true);
}
public T poll() {
if (!takeSemaphore.tryAcquire()) {
return null;
}
return queue.poll();
}
public T poll(long millis) throws InterruptedException {
if (!takeSemaphore.tryAcquire(millis, TimeUnit.MILLISECONDS)) {
return null;
}
return queue.poll();
}
public T take() throws InterruptedException {
takeSemaphore.acquire();
return queue.poll();
}
public void add(T t) {
queue.add(t);
takeSemaphore.release();
}
public static void main(String[] args) throws Exception {
FairBlockingQueue<Object> q = new FairBlockingQueue<Object>();
Object o = q.poll();
assert o == null;
o = q.poll(1000);
assert o == null;
q.add(new Object());
q.add(new Object());
q.add(new Object());
o = q.take();
assert o != null;
o = q.poll();
assert o != null;
o = q.poll(1000);
assert o != null;
o = q.poll();
assert o == null;
}
}
buena y justa solución, aunque sugiero usar PriorityBlockingQueue – Michael
Gracias, Michael. Si queremos usar algo de fábrica, sin duda podemos elegir un PriorityBlockingQueue, sin embargo, el PBQ y el FBQ sugerido anteriormente son diferentes en lo que respecta a ordenar/ordenar. PBQ mantiene sus elementos ordenados según su orden natural utilizando un montón de prioridad, y tomar elementos de un PBQ sucede en este orden particular, mientras que el FBQ está respaldado por una ConcurrentLinkedQueue que es una cola FIFO normal. –
Por cierto, el take() en PriorityBlockingQueue de Java SE 6 es justo para los llamantes ya que se implementa con un ReentrantLock justo, pero en Java SE 7 se implementa con ReentrantLock no justo y, respectivamente, no es justo para quienes llaman. Acabo de consultar las fuentes. –
- 1. Cola concurrente y de bloqueo en Java
- 2. ¿Por qué ArrayBlockingQueue se llama una cola limitada mientras que LinkedBlockingQueue se llama cola de bloqueo ilimitada?
- 3. ¿Hay alguna diferencia entre el "bloqueo" de Java y el "bloqueo" de C#?
- 4. teclado cola de bloqueo interrumpible en Python
- 5. ¿Hay un OutputStream en el bloqueo de Java? (Sockets)
- 6. Cola de bloqueo de Java que contiene solo elementos únicos
- 7. Feria algoritmo de distribución de productos
- 8. ¿Es esto (bloqueo) la implementación de cola Thread-Safe?
- 9. Implementación de cola de bloqueo de subprocesos en .NET
- 10. efectos de bloqueo en Java
- 11. Cola llena, profundidad de la cola de bloqueo, se necesita aclaración
- 12. ¿Existe una implementación de cola FIFO optimista sin bloqueo?
- 13. ¿Hay alguna aplicación de kernel/escritorio Java?
- 14. Java: cola de prioridad
- 15. ¿Hay alguna biblioteca de Java para la generación de miniaturas?
- 16. Una cola rápida en Java
- 17. bloqueo gama en java
- 18. C++ pthread bloqueo de interbloqueo de cola (creo)
- 19. Bloqueo de archivos Java
- 20. cola Reordenar en ThreadPoolExecutor de Java
- 21. ¿Hay alguna variable abstracta en java?
- 22. bloqueo de subproceso Java
- 23. El bloqueo de cola - Necesidad de más información
- 24. ¿Hay alguna manera de obtener inserción/extracción de secuencias sin bloqueo en basic_iostream en Windows?
- 25. Bloqueo parcial en java
- 26. ¿Hay alguna manera de imitar o en genéricos de Java
- 27. cola segura para hilos sin bloqueo en C++?
- 28. ¿Hay una instrucción de bloqueo en VB.NET?
- 29. Liberar bloqueo de archivos Java en Windows
- 30. ¿Hay alguna forma de compilar código Java en una DLL?
¿Qué pasa con ConcurrentLinkedList? (De acuerdo, no es una 'cola' por decir ... y no estoy seguro si es más 'justo') –