Hace poco escribí un programa simultáneo en Java y encontré el dilema de seguimiento: supongamos que tiene una estructura de datos global, que es parte de lib no concurrente regular, como HashMap. ¿Está bien permitir que múltiples hilos iteren a través de la colección (solo lectura, sin modificaciones) tal vez en diferentes períodos intercalados, es decir, thread1 podría estar a mitad de camino iterando cuando thread2 obtiene su iterador en el mismo mapa?Múltiples hilos que iteran en el mismo mapa
Respuesta
Está bien. La capacidad de hacer esto es la razón para crear dicha interfaz como iterador. Cada hilo que itera sobre la colección tiene su propia instancia de iterador que mantiene su estado (por ejemplo, donde se encuentra ahora en su proceso de iteración).
Esto permite que varios hilos iteren sobre la misma colección simultáneamente.
Los problemas solo surgen cuando intenta modificaciones simultáneas en una estructura de datos.
Por ejemplo, si un hilo se itera sobre el contenido de un mapa, y otro hilo elimina elementos de esa colección, se dirigirá a un problema grave.
Si necesita algunos subprocesos para modificar esa colección de forma segura, Java proporciona mecanismos para hacerlo, es decir, ConcurrentHashMap.
También hay Hashtable, que tiene la misma interfaz que HashMap, pero está sincronizada, aunque su uso no se recomienda actualmente (en desuso), ya que es el rendimiento se resiente cuando el número de elementos se hace más grande (en comparación a ConcurrentHashMap que no necesita bloquear toda la Colección).
Si tiene una colección que no está sincronizada y necesita tener varios hilos para leer y escribir sobre ella, puede usar Collections.synchronizedMap (Map) para obtener una versión sincronizada de la misma.
Debería estar bien, siempre y cuando no haya escritores.
Este problema es similar al readers-writer lock, donde varios lectores pueden leer los datos, pero no durante el tiempo que un escritor "tiene" el bloqueo. No hay problemas de concurrencia para lecturas múltiples al mismo tiempo. [data race puede ocurrir solo cuando tiene al menos una escritura].
Las respuestas anteriores son sin duda un buen consejo. En general, al escribir Java con subprocesos concurrentes, siempre que no modifique una estructura de datos, no tiene que preocuparse de que varios subprocesos lean dicha estructura simultáneamente.
En caso de que tenga un problema similar en el futuro, excepto que la estructura de datos global podría modificarse simultáneamente, sugeriría escribir una clase Java que todos los hilos usen para acceder y modificar la estructura. Esta clase podría implementar su propia metodología de simultaneidad, utilizando métodos sincronizados o bloqueos. El tutorial de Java tiene una muy buena explicación de los mecanismos de concurrencia de Java. Yo personalmente he hecho esto y es bastante sencillo.
- 1. Ejecutando múltiples hilos al mismo tiempo
- 2. Múltiples hilos y memoria
- 3. Hacer que los hilos tengan el mismo número de timeslices
- 4. ScheduledExecutorService múltiples hilos en paralelo
- 5. Ejecutar múltiples hilos UI
- 6. Creando múltiples hilos para el mismo método en una instancia en un objeto
- 7. Múltiples hilos o procesos con hilos
- 8. python: cómo enviar paquetes en múltiples hilos y luego el hilo se mata a sí mismo
- 9. ¿Cómo aborto múltiples hilos?
- 10. Coma en CSS, selectores múltiples que usan el mismo CSS
- 11. ¿Sinatra tiene múltiples hilos?
- 12. Cómo utilizar múltiples hilos
- 13. El uso de múltiples hilos de bucle
- 14. Hilos OpenMP ejecutándose en el mismo núcleo de la CPU
- 15. Registre el mismo tipo en múltiples interfaces
- 16. Representación en un único objeto de mapa de bits a partir de múltiples hilos
- 17. bloqueo en una variable en múltiples hilos
- 18. Subprocesos múltiples de Python que acceden al mismo archivo
- 19. ¿Cómo hacer que múltiples vistas tengan el mismo ancho?
- 20. Proyectos múltiples que comparten el mismo código sin referencia circular
- 21. Java Swingworker y múltiples hilos
- 22. C++ - hilos y múltiples colas
- 23. ¿Cómo hacer que varios hilos procesen el mismo resultado de IEnumerable?
- 24. Técnica para ejecutar múltiples MapActivities en el mismo proceso
- 25. Múltiples hilos de host que inician kernels CUDA individuales
- 26. Matplotlib: trazado simultáneo en múltiples hilos
- 27. Mismo botón en múltiples actividades
- 28. Varios hilos que escriben el mismo valor en la misma ubicación de memoria global
- 29. ¿Cómo ilustrar múltiples hilos en el diagrama de secuencia?
- 30. Mapa bidireccional de valores múltiples en Java
Como dices, los hilos tienen diferentes iteradores. Como no se comparten, no hay problema. –
Gracias chicos, excelentes respuestas! – Bober02