Contenido de certificación
Buscar
Social
Ofertas laborales ES
« Recorrer un Map | Main | Clases y tipos genéricos »
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.

octubre 25, 2012 | Unregistered CommenterAndrés Viedma

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.

octubre 25, 2012 | Registered Commenterchoces

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.

octubre 25, 2012 | Registered Commenterjcarmonaloeches

HashSet no es sincronizada. Creo que te refieres a CopyOnWriteArrayList, que sí lo es.

octubre 26, 2012 | Registered Commenterchoces

Si, @choces, creo que tienes razón con respecto a CopyOnWriteArrayList

noviembre 2, 2012 | Registered Commenterjcarmonaloeches

PostPost a New Comment

Enter your information below to add a new comment.

My response is on my own website »
Author Email (optional):
Author URL (optional):
Post:
 
Some HTML allowed: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <code> <em> <i> <strike> <strong>