Deadlock - Abrazo Mortal
Enviado por fcardenas1980 • 6 de Marzo de 2012 • 860 Palabras (4 Páginas) • 735 Visitas
¿Qué es un deadlock?
Es de conocimiento de muchos programadores que el uso de la palabra clave ’synchronized’ ya sea para establecer metodos o bloques de código sincronizado, afectan el optimo desempeño de las aplicaciones con respecto a la velocidad de proceso. Aunque el uso abusivo de estos bloques de código sincronizado no es recomendable, las constantes mejoras en la máquina virtual de java a través de los años han hecho que el porcentaje de desempeño afectado versus los enormes beneficios que trae a la hora de resolver problemas de concurrencia, hacen que la balanza se incline en favor de este último.
El principal problema asociado con el abuso de los bloques de código sincronizado es que entra más bloques de este tipo tengamos dentro de una aplicación, mayor será la probabilidad que en algún punto durante la ejecución del programa, ocurra un DeadLock y el programa empiece un bucle infinito lo cual hará que finalmente el programa sea forzado a su reinicio manualmente.
Generalmente, un DeadLock ocurre cuando al menos dos hilos intentan asegurar un objeto al mismo tiempo. Con el fin de ser más específico doy un ejemplo: El hilo A asegura el objeto obj1 mientras el hilo B asegura el objeto obj2. Luego el hilo A intenta asegurar el objeto obj2 antes de liberar el objeto obj1. Al mismo tiempo el hilo B intenta asegurar el objeto obj1 antes de liberar el objeto obj2. Lo que tenemos aquí es que el hilo A esperara hasta que el hilo B libere el objeto obj2, mientras que B seguirá esperando hasta que el hilo A libere el objeto obj1 y así se quedaran esperando el uno al otro hasta el día del juicio final.
¿Qué ocasiona un deadlock?
Saber cuándo ocurrirá un DeadLock es difícil debido a la baja posibilidad de que dos hilos obtengan acceso a ambos métodos simultáneamente. Sin embargo puede pasar repentinamente. Puede suceder solo una vez durante un determinado periodo de tiempo o puede pasar muchas veces dentro del mismo periodo. Detectar este tipo de problemas solamente analizando código puede ser bastante difícil. Un error como el mencionado arriba puede ser fácil de detectar e inferir que el problema se resuelve cambiando el orden en que los objetos son asegurados. En otras palabras los objetos deben ser asegurados en el mismo orden en ambos métodos de tal manera que el DeadLock no sea posible
¿Cómo se evita un deadlock?
Bien, la pregunta que seguramente a estado dando vueltas en sus cabezas es como prevenir tales problemas cuando es necesario accesar un objeto de manera sincronizada? Una de las posibles soluciones es ordenar cuidadosamente el orden en que los métodos sincronizados son llamados desde diferentes hilos o el orden en el cual los parámetros son pasados los métodos que contienen bloques de código sincronizado. Con el fin de hacer esto debemos observar en qué orden los Locks son obtenidos dentro del método. Esto
...