Estaba buscando el código de colecciones simultáneas de Java y veo que simplemente envuelven colecciones simples con bloqueo de algún bloqueo al principio de la operación y desbloqueándolo al final.Por qué las colecciones concurrentes de Java son realmente seguras para subprocesos
¿Qué hay de volatile
? Si la colección de back-end no es volátil, otros subprocesos podrían perder los cambios y, por lo tanto, el almacenamiento de la tarea de ejecución de subprocesos se rompe un tanto. Sé que synchronized
puede resolver este problema, pero solo usan bloqueos sin más sincronización.
¿Eso es un problema o me falta algo?
Actualización:
Después de una ligera discusión quiero reformular la pregunta un poco.
Quiero usar una colección de Java en un entorno de múltiples hilos. (Por ejemplo, actualmente estoy hablando de PriorityBlockingQueue
)
Quiero estar seguro de que los cambios que hace un hilo en la colección (push/pop) son inmediatamente visibles para los demás.
Es bueno que las colecciones simultáneas de Java eviten que me sumerja en problemas para mantener estable el estado interno de la colección cuando el número de subprocesos lo actualiza, pero Quiero asegurarme de que los datos sean visibles para todos los hilos.
La pregunta es: ¿estoy seguro de que las colecciones simultáneas de Java no proporcionan esta característica de la caja? Y si lo hago, ¿qué técnicas adicionales (costo minimalista) debo usar para proporcionar la visibilidad deseada?
Gracias.
Es importante tener en cuenta que 'sincronizado' en Java no es solo un 'mutex' o un bloqueo. Es un contrato sobre lo que sucede, antes de las relaciones y la coherencia de la vista. Un bloque sincronizado tiene un alcance dinámico a medida que desciende las pilas de llamadas junto con la ejecución (frente a ser simplemente léxico en el alcance). Ver http://stackoverflow.com/questions/3214938/java-volatile-modifier-and-synchronized-blocks (He visto algunas preguntas SO realmente buenas que muestran el JLS en detalle, pero no puedo encontrarlas en el momento: - /) Tal vez vea: http://java.sun.com/docs/books/jls/second_edition/html/memory.doc.html –
No quiero un mutex, solo quiero que todos los cambios se vería a todos los hilos. Por lo tanto, quiero evitar el uso de mecanismos de sincronización innecesarios. – jutky
Es importante tener en cuenta que 'sincronizado' en Java * no es solo * un 'mutex' o un bloqueo .... hay otros métodos de sincronización, pero se toman un poco más de reflexión. 1) Un algoritmo "libre de bloqueo" como ConcurrentLinkedQueue 2) volátil (no crea secciones atómicas) 3) una de las clases Atomic * (soporte CAS e incremento atómico, etc.) ... de todos modos. –