DeadLock y sus causas - 1

"¡Hola, amigo!"

“Hoy les voy a contar qué es el punto muerto”.

"Oye, ya me hablaste de algo así".

"Sí, lo hice. Pero hoy consideraremos el tema con mayor detalle".

"En el caso más simple, el interbloqueo involucra dos subprocesos y dos objetos mutex. Un bloqueo mutuo ocurre cuando:"

A) Cada subproceso necesita adquirir ambos mutexes.

B)  El primer subproceso ha adquirido el primer mutex y está esperando que se libere el segundo.

C)  El segundo subproceso ha adquirido el segundo mutex y está esperando que se libere el primero.

"Aquí hay unos ejemplos:

Ejemplo
 public class Student
{
 private ArrayList friends = new ArrayList();

 public synchronized ArrayList getFriends()
 {
  synchronized(friends)
  {
   return new ArrayList(friends);
  }
 }

 public synchronized int getFriendsCount()
 {
  return friends.size();
 }

 public int addFriend(Student student)
 {
  synchronized(friends)
  {
   friends.add(student)
   return getFriendsCount ();
  }
 }
}

"Supongamos que un subproceso llama al método getFriends , adquiere la exclusión mutua de este objeto y luego adquiere la exclusión mutua del objeto amigos ".

"Mientras tanto, un segundo subproceso llama al método addFriend , adquiere la exclusión mutua del objeto amigos y luego adquiere la exclusión mutua de este objeto (durante una llamada a getFriendsCount )".

"Al principio, todo estará bien, pero como establece la Ley de Murphy: cualquier cosa que pueda salir mal, saldrá mal. Inevitablemente, surgirá una situación en la que el primer subproceso solo tendrá tiempo de adquirir un mutex, y el segundo subproceso adquirirá el segundo. mutex en ese mismo momento. Se colgarán así, siempre esperando que el otro subproceso libere el mutex".

"He decidido citar otro ejemplo simple que encontré en un libro:"

Ejemplo
class KnightUtil
{
 public static void kill(Knight knight1, Knight knight2)
 {
  synchronized(knight1)
  {
   synchronized(knight2)
   {
    knight2.live = 0;
    knight1.experience += 100;
   }
  }
 }
}

"Hay un juego en el que dos caballeros luchan entre sí. Un caballero mata al otro. Este comportamiento se refleja en el método de matar . Se le pasan dos objetos de caballero.

"Primero, protegemos ambos objetos para que nadie más pueda cambiarlos".

"El segundo caballero muere (HP = 0)"

"El primer caballero gana 100 XP".

"Todo parece estar bien, pero puede haber situaciones en las que el segundo caballero ataque al primero al mismo tiempo. Este método también se aplica al segundo caballero, pero los objetos del caballero se pasan en un orden diferente".

"¿Quieres decir que ni siquiera necesitamos múltiples métodos para llegar a un punto muerto?"

"Correcto. A veces solo se necesita un método simple para hacer que los hilos y todo el programa se cuelguen".

"Sí, supongo que este fenómeno ocurre con más frecuencia de lo que pensaba. Gracias, Ellie".