Introducción
El interbloqueo (deadlock) se puede definir como el bloqueo permanente de un conjunto de procesos que compiten por los recursos del sistema o bien se comunican unos con otros. A diferencia de otros problemas de la gestión concurrente de procesos, no existe una solución eficiente para el caso general.
Todos los interbloqueos suponen necesidades contradictorias de recursos por parte de dos o más procesos.
A veces, los interbloqueos se denominan "abrazo mortal".
El interbloqueo puede definirse formalmente como sigue: Un conjunto de procesos está en interbloqueo si cada proceso del conjunto está esperando un evento que sólo otro proceso del conjunto puede causar. Puesto que todos los procesos están esperando, ninguno de ellos puede causar ninguno de los eventos que podrían despertar a cualquiera de los demás miembros del conjunto, y todos los procesos continúan esperando indefinidamente.
Código en Java Deadlock
Deadlock
describe una situación en la que dos o más hilos están bloqueados constantemente,
esperando a los demás. He aquí un ejemplo.
Alphonse
y Gaston son amigos, y grandes creyentes de la cortesía. Una regla estricta de cortesía es que
cuando haces reverencia a un amigo, debes permanecer inclinado hasta que tu
amigo tenga la oportunidad de responder la reverencia. Desafortunadamente,
esta regla no tiene en cuenta la posibilidad de que dos amigos hagan reverencia
el uno al otro al mismo tiempo. Esta aplicación de ejemplo, Deadlock, modela
esta posibilidad:
public class Deadlock {
static class Friend {
private final String name;
public Friend(String name)
{
this.name = name;
}
public String getName() {
return this.name;
}
public synchronized void
bow(Friend bower) {
System.out.format("%s:
%s has bowed to me!%n",
this.name,
bower.getName());
bower.bowBack(this);
}
public synchronized void
bowBack(Friend bower) {
System.out.format("%s:
%s has bowed back to me!%n",
this.name,
bower.getName());
}
}
public static void
main(String[] args) {
final Friend alphonse =
new Friend("Alphonse");
final Friend gaston = new
Friend("Gaston");
new Thread(new Runnable()
{
public void run() {
alphonse.bow(gaston); }
}).start();
new Thread(new Runnable()
{
public void run() {
gaston.bow(alphonse); }
}).start();
}
}
Cuando
se ejecuta Deadlock, es muy probable que ambos hilos se bloqueen cuando
intenten invocar bowBack. Ningún bloque nunca terminaría porque cada hilo está
esperando a que el otro salga.
Ejecución del código
Comentario de los resultados de la ejecución del código
Casi siempre el programa nunca va terminar su ejecución ya que los procesos se quedan "atorados" y no avanzan, aunque puede darse el caso de que los procesos no se bloqueen entre sí y el programa logre terminar su ejecución.
Código en Java Deadlock con nombres
Ejecución del código con nombres
Comentario de los resultados de la ejecución del código con nombres
Ocurre lo mismo que en la primera ejecución del código, los procesos se quedan "atorados" y no avanzan, aunque puede darse el caso de que los procesos no se bloqueen entre sí y el programa logre terminar su ejecución.
Manera en la que se presenta el Deadlock en el programa
1. Cuando
entra Alphonse.bow (gaston); Alphonse esta ahora bloqueado debido a la palabra
clave “Synchronized".
2. Cuando
entra gaston.bow (Alphonse); Gaston está ahora bloqueado.
3. No
puede ejecutarse “bower.bow Back(thie); del primer método bow que se llama,
porque gaston (bower) es bloqueado.
* Espera a que sea liberado el bloqueo.
4. No
puede ejecutarse el bower.bowback(this) del segundo método llamado porque
Alphonse(bower) esta bloqueado.
*Espera
a que el bloqueo sea liberado.
En pocas palabras ambos hilos esperan el un o por el otro para que sea
liberado el bloqueo.
No hay comentarios.:
Publicar un comentario