Estrategias para evitar el deadLock - 1

"¡Hola, amigo!"

"Quiero contarles un par de estrategias para evitar los puntos muertos".

"La mejor estrategia es una arquitectura reflexiva y un conjunto de reglas que rijan cuándo y en qué orden puede usar bloqueos (adquirir mutexes). El enfoque clásico del problema es desarrollar una jerarquía de bloqueos y establecer la regla de que ciertos bloqueos nunca pueden ser adquirido en un estado en el que ya se han adquirido otras cerraduras".

"Por ejemplo, a veces a los bloqueos se les asignan niveles, y se requiere un subproceso para adquirir bloqueos en orden de niveles más altos a niveles más bajos (pero no se permite adquirir bloqueos en la otra dirección). Además, no se permite adquirir múltiples bloqueos con el mismo nivel. permitido."

"Por ejemplo, en el ejemplo anterior con los caballeros, podríamos agregar un número único (id) a cada caballero y requerir que los candados se adquieran desde el id más grande hasta el id más pequeño".

Ejemplo
class KnightUtil
{
 public static void kill(Knight knight1, Knight knight2)
 {
  Knight knightMax = knight1.id > knight2.id ? knight1: knight2;
  Knight knightMin = knight1.id > knight2.id ? knight2: knight1;

  synchronized(knightMax)
  {
   synchronized(knightMin)
   {
    knight2.live = 0;
    knight1.experience +=100;
   }
  }
 }
}

"Esa es una hermosa solución".

"Es una solución muy simple, pero me gusta. Espero que te sea útil cuando estés pensando en cómo resolver posibles problemas de punto muerto".

"Gracias, Ellie".