02.09.2009 08:59:00 |
|
admin
|
Por Guido J. Granobles.
Es conocido por muchos que el uso de la palabra clave synchronized ya sea para el establecimiento de métodos o bloques de código sincronizado afecta el desempeño óptimo de las aplicaciones en cuanto a velocidad de procesamiento se refiere. Aunque el uso abusivo de este tipo de bloques de código se ha condenado desde sus inicios cabe decir que las constantes mejoras de la JVM a través de los años hace que la comparación entre el porcentaje de desempeño afectado VS los grandes beneficios a la hora de resolver problemas de concurrencia, inclinan la balanza hacia este ultimo. El principal problema asociado con el uso excesivo de los bloques de código sincronizado está en que a medida que se incrementan este tipo de métodos o bloques en una aplicación, mayor es la posibilidad de que en algún punto del programa durante la ejecución del mismo se presenten los conocidos DeadLocks que hacen que la aplicación entre en un loop infinito obligando a que sea reiniciada.
En concreto un DeadLock ocurre cuando como mínimo dos hilos intentan simultáneamente asegurar un objeto que el hilo contrario ya tiene. Para ser más claro expondré un ejemplo, el hilo A obtiene el Lock del objeto1 (o asegura el objeto1) mientras el hilo B obtiene el Lock del objeto2, seguidamente el hilo A intenta obtener el Lock del objeto2 antes de liberar el Lock del objeto1, al mismo tiempo el hilo B intenta obtener el Lock del objeto1 antes de liberar el Lock del objeto2, lo que tenemos aquí es que el hilo A esperara hasta que el hilo B libere el Lock del objeto2 mientras el Hilo B está esperando a que el hilo A libere el Lock del objeto1 y así se quedaran esperando el uno al otro hasta el día del juicio final o hasta que alguien reinicie la aplicación o la maquina. Veamos el ejemplo en código: