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?
Respuesta
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.
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?
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
- 1. ¿Hay algún kernel pequeño lo suficientemente bueno para aprender osdev?
- 2. Consecuencias de hacer un software "lo suficientemente bueno"
- 3. ¿Cuándo Google Analytics no es lo suficientemente bueno?
- 4. DevExpress para ASP.NET es lo suficientemente rápido
- 5. agrupaciones de hilos individuales o múltiples para el servidor Java?
- 6. Es C# lo suficientemente rápido para juegos
- 7. Java Swingworker y múltiples hilos
- 8. ¿El pistón django es lo suficientemente maduro?
- 9. Convertir SVG a PDF (svglib + reportlab no es lo suficientemente bueno)
- 10. ¿Es D lo suficientemente potente para estas funciones?
- 11. ¿Es SQL Server Express lo suficientemente bueno para un desarrollador, o deberían obtener la edición de desarrollador?
- 12. php orm lo suficientemente potente?
- 13. Es urlencode() lo suficientemente bueno como para detener todos los ataques de inyección SQL en el año 2011
- 14. Java: ¿LinkedBlockingQueue tiene en cuenta el orden de los consumidores?
- 15. ¿El IDE Scala Eclipse es lo suficientemente estable?
- 16. extjs: lo que es bueno para xtype
- 17. ¿El plugin de Maven Surefire ejecuta pruebas usando múltiples hilos?
- 18. ¿Es Request.ServerVariables ["REMOTE_ADDR"] lo suficientemente confiable?
- 19. LinkedBlockingQueue vs ConcurrentLinkedQueue
- 20. ¿System.Threading.Timer es lo suficientemente eficiente para miles de temporizadores simultáneos?
- 21. Sphinx autodoc no es lo suficientemente automático
- 22. ¿Cuándo Spring + Tomcat no es lo suficientemente potente?
- 23. ¿Mono es estable y lo suficientemente rápido?
- 24. ¿Hilos dentro de hilos en Java?
- 25. Hilos Java vs Hilos OS
- 26. El uso de múltiples hilos de bucle
- 27. Argumentos Prolog no están lo suficientemente instanciados
- 28. ¿Qué es "lo suficientemente desinfección" para una dirección URL
- 29. ¿Contenedores clave, lo suficientemente seguros como para almacenar claves privadas?
- 30. ¿La especificación # es lo suficientemente estable como para usarla?
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() ''? –
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
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? –