miércoles
oct242012
Bucle infinito en WeakHashMap no sincronizado
Acabo de leer un artículo en el blog de Adam Bien, donde asegura que se puede producir un bucle infinito en el método get(Object key) de java.util.WeakHashMap
Ya se sabe que esa clase no es thread-safe; sin embargo que pueda producir un bucle infinito, si no está sincronizada, me suena extraño, como poco.
Aunque asegura que es un caso raro, proporciona datos de casos reales en los que se ha producido.
¡Habrá que tenerlo en cuenta, por si acaso!
Reader Comments (5)
Ojo, doy fe de que es cierto. Y añado: no sólo en WeakHashMap, también ocurre con HashMap. Y si no recuerdo mal, también me ha ocurrido alguna vez con ArrayList. En una web, el efecto de esto es fulminante: la web empieza a dejar threads bloqueado y minutos después se muere, sin dar pistas de por qué ha ocurrido. Así que mucho cuidadín, siempre que más de un thread pueda acceder a una colección, es fundamental que se usen colecciones sincronizadas.
Lo que suele suceder es que se produzca un ConcurrentModificationException cuando se modifican elementos de una colección no sincronizada, desde varias tareas simultáneas. Es un problema habitual con los iteradores, incluso en colecciones sincronizadas por diseño.
Lo extraño de este caso es que se produzca un lazo infinito en un método get.
Recordamos que Vector es la lista de Java con métodos sincronizados.
HashSet lo mismo, pero para Sets (creo recordar, si alguien me corrige, genial)...
Los hilos pueden ser muy criminales si no se tiene conocimiento del funcionamiento, ahora bien, en ocasiones vienen pero que muy bien para mejorar el rendimiento de la aplicación, sólo hay que conocer qué recursos son compartidos y sincronizar los métodos correspondientes.
En mi caso, tenemos dos procesos, de los que creamos cinco hilos para cada uno. Ambos procesos acceden a base de datos: uno lee y cuando termina de leer, actualiza los datos para decir "hey, que ya he leido estos datos". Entonces, el otro hilo debe esperar a que este primer hilo termine de leer los datos y actualizarlos antes de realizar el la operación, porque si no podrá existir un error de coherencia en la ejecución.
En el caso de listas, puede suceder que si dos hilos comparten una lista, y ambas entran en el método add, que imaginemos, tiene 5 líneas de código, un hilo esté en la línea 2, y otro hilo en la línea 4, siendo incoherente la ejecución.
Saludos y gracias por el aporte.
HashSet no es sincronizada. Creo que te refieres a CopyOnWriteArrayList, que sí lo es.
Si, @choces, creo que tienes razón con respecto a CopyOnWriteArrayList