Tengo el problema clásico de un hilo que empuja eventos a la cola entrante de un segundo hilo. Solo que esta vez, estoy muy interesado en el rendimiento. Lo que quiero lograr es:Cola concurrente y de bloqueo en Java
- Quiero el acceso simultáneo a la cola, el productor empujando, el receptor abierto.
- Cuando la cola está vacía, quiero que el consumidor bloquee la cola, esperando al productor.
Mi primera idea fue utilizar un LinkedBlockingQueue
, pero pronto me di cuenta de que no es concurrente y el rendimiento sufrió. Por otro lado, ahora uso un ConcurrentLinkedQueue
, pero aún estoy pagando el costo de wait()
/notify()
en cada publicación. Dado que el consumidor, al encontrar una cola vacía, no bloquea, tengo que sincronizar y wait()
en un bloqueo. Por otro lado, el productor tiene que obtener ese bloqueo y notify()
en cada publicación. El resultado general es que estoy pagando el costo de sycnhronized (lock) {lock.notify()}
en cada publicación, incluso cuando no sea necesario.
Lo que supongo que es necesario aquí, es una cola que es a la vez de bloqueo y concurrente. Imagino una operación push()
para trabajar como en ConcurrentLinkedQueue
, con un notify()
extra al objeto cuando el elemento empujado es el primero en la lista. Tal comprobación considero que ya existe en el ConcurrentLinkedQueue
, ya que presionar requiere conectarse con el siguiente elemento. Por lo tanto, esto sería mucho más rápido que sincronizar cada vez en el bloqueo externo.
¿Hay algo como esto disponible/razonable?
¿Por qué crees que java.util.concurrent.LinkedBlockingQueue no es concurrente? Creo que es perfectamente concurrente, al ver su javadoc y el código fuente. Pero no tengo idea sobre el rendimiento. – Rorick
Ver también http://stackoverflow.com/questions/1301691/java-queue-implementations-which-one – Vadzim