2012-09-26 16 views
8

Tengo un consumidor y un productor que agrega y elimina objetos Item de la cola. Si utilizo los métodos put() y take(). ¿Hay algún problema de seguridad de hilos que necesite cubrir? Esto es similar al problema del búfer limitado y me preguntaba si el uso de la cola de bloqueo reemplaza la necesidad de semáforos o monitores. El objeto Item mismo probablemente necesitaría sincronización (setters pero los getters no necesitan lock), ¿estoy en lo cierto? Y, por último, no estoy muy seguro de cómo comprobar si es seguro para subprocesos, ya que no puedo hacer que ambos hilos llamen simultáneamente al take() porque el orden de ejecución no es exhaustivo. ¿Algunas ideas? Gracias.¿Usando LinkedBlockingQueue lo suficientemente bueno para el programa Java de múltiples hilos?

+0

Aunque el orden de ejecución es no determinista, sería la evidencia de que LBQ no es lo suficientemente bueno sería si algunos elementos que '' poner() '' no aparecen, o el mismo artículo se muestra repetidamente en los resultados de '' take() ''? –

+0

Supongo que es una prueba posible, pero puede no ser siempre una prueba específica de hilo. ¿Tal vez usando thread sleep en el medio de llamar a take() mientras que otro hilo lo llama también? – Dan

+0

Es lo que los ejecutores usan por defecto lo que me lleva a la pregunta; ¿no puedes usar un ExecutorService que envuelve un Queue y un Thread Pool? –

Respuesta

7

Es perfectamente seguro para la rosca de lo que está haciendo, de hecho, esto es lo que está diseñado. La descripción de BlockingQueue (que es la interfaz implementada por LinkedBlockingQueue) establece:

implementaciones BlockingQueue son thread-safe. Todos los métodos de puesta en cola logran sus efectos atómicamente mediante bloqueos internos u otras formas de control de concurrencia.

1

puesto simultánea() y tomar() son noflujos seguros ya que utilizan 2 cerraduras diferentes.

Esto ya está aquí la respuesta: no Are LinkedBlockingQueue's insert and remove methods thread safe?

+0

Seguí el enlace y encontré una respuesta a otra publicación explicando por qué es seguro para subprocesos. http://stackoverflow.com/questions/26543807/is-blockingqueue-completely-thread-safe-in-java/26543940#26543940 – user1266174

Cuestiones relacionadas