2010-04-23 9 views

Respuesta

45

Sí. De the docs:..

"implementaciones BlockingQueue son thread-safe Todos los métodos que hacen cola lograr sus efectos atómicamente utilizando cerraduras interiores u otras formas de control concurrencia Sin embargo, la mayor operaciones Collection addAll, containsAll, retainAll y removeAll no se realizan necesariamente atómicamente a menos que se especifique lo contrario en una aplicación. por lo tanto, es posible, por ejemplo, para addAll (c) falle (una excepción) después agregando solo algunos de los elementos en c. "

+0

no es en realidad. No, no si solo está usando agregar y tomar, pero si usa una operación masiva, tendría que sincronizarla en lugar de simplemente "Sí". ¿O estoy leyendo el documento equivocado? – cproinger

+0

@cproinger, no, nunca tiene que sincronizarlo, siempre y cuando esté dispuesto a tratar con 'addAll' lanzando una excepción después de agregar un subconjunto de los elementos (o similar). Depende de cómo definas thread-safe. Tiene razón en que los métodos a granel no tienen una garantía de atomicidad. –

+0

¿Es 'remove' también seguro para subprocesos? – q126y

8

Sí, BlockingQueue métodos add()take() y son seguros para subprocesos pero con una diferencia.

add() y take() método utiliza 2 objetos diferentes ReentrantLock.

add() método utiliza

private final ReentrantLock putLock = new ReentrantLock(); 

take() método utiliza

private final ReentrantLock takeLock = new ReentrantLock(); 

Por lo tanto, el acceso simultáneo a add() método está sincronizado. Del mismo modo, el acceso simultáneo al método take() es synchronized.

Pero, el acceso simultáneo a add() y take() método no es synchronized ya que están usando 2 Bloqueo de objetos diferentes (excepto durante la condición de borde de cola llena/vacía).

+3

Esta respuesta hace una observación válida, pero se echa de menos que los implementadores de LinkedBlockingQueue conocían este problema y lo abordaron. Detalles aquí: http://stackoverflow.com/questions/26543807/is-blockingqueue-completely-thread-safe-in-java/26543940#26543940 –

+0

Sí, estoy de acuerdo. LInkedBlockingQueue ofrece mejor concurrencia que ArrayBlockingQueue y mantiene la seguridad de la secuencia sincronizando únicamente la condición de borde. Los métodos de inserción y eliminación se sincronizaron inteligentemente solo para casos extremos –

+0

Esta respuesta es incorrecta. 'add' y' take' son seguros para subprocesos y se pueden usar al mismo tiempo sin sincronización adicional. – ens

0

Simplemente Sí, definitivamente es seguro para los hilos, de lo contrario no calificaría como candidato para el elemento de almacenamiento ThreadPoolExecutor.

Simplemente agregue y recupere el elemento sin preocuparse por la simultaneidad de BlockingQueue.

Cuestiones relacionadas