En los anteriores volúmenes hemos visto cómo funcionan los monitores, semáforos y locks en Java, que está estrechamente relacionado con la programación concurrente en Java.
Sin embargo, no hemos hablado de un problema muy común que suele producirse en los sistemas concurrentes: El famoso y temido interbloqueo.
Un deadlock, o también conocido como interbloqueo, impide que el programa concurrente pueda continuar su ejecución ya que queda completamente bloqueado y no puede avanzar.
¿Qué condiciones deben darse para que se pueda producir un interbloqueo?
- Exclusión mutua para poder reutilizar los recursos compartidos.
- Asignación parcial de recursos, de tal forma que el proceso sólo bloquee lo que necesita en ese momento y no todos (para aumentar el rendimiento del programa).
- Una vez que se ha adquirido el recurso, no lo liberamos hasta que no hemos cogido el otro y terminar con nuestra acción.
- Espera circular: liberación de procesos en serie, es decir, cuando un proceso espera a otro, y a su vez ese otro está esperando al siguiente.
Debemos diseñar nuestro programa para evitar interbloqueos. Al principio, el programa creado puede no interbloquearse, pero es posible que al cabo de varios minutos sí llega a interbloquearse, por lo que debemos tener cuidado a la hora de programar. Si no estamos muy experimentados, siempre podemos hacer prueba/error para comprobar el resultado de nuestro programa.
Al interbloqueo también se le suele llamar bloqueo mutuo. En Wikipedia podemos encontrar más información sobre el bloqueo mutuo.
También podemos ver el siguiente vídeo de Youtube que muestra el DeadLock:
Un problema clásico de DeadLock es el de la cena de los filósofos que podéis encontrar también en Wikipedia.
Por tanto, debemos programar de tal forma para evitar este grave problema que nos puede dejar nuestro programa totalmente inutilizado y todo lo que ello conlleva.