Estratégias para evitar DeadLock - 1

"Olá, amigo!"

"Quero falar sobre algumas estratégias para evitar impasses."

"A melhor estratégia é uma arquitetura cuidadosa e um conjunto de regras que regem quando e em que ordem você pode usar bloqueios (adquirir mutexes). A abordagem clássica para o problema é desenvolver uma hierarquia de bloqueio e estabelecer a regra de que determinados bloqueios nunca podem ser adquiridos em um estado onde alguns outros bloqueios já foram adquiridos."

"Por exemplo, às vezes os bloqueios são atribuídos a níveis e um encadeamento é necessário para adquirir bloqueios de níveis mais altos para níveis mais baixos (mas adquirir bloqueios na outra direção não é permitido). Além disso, adquirir vários bloqueios com o mesmo nível não é permitido."

"Por exemplo, no exemplo anterior com cavaleiros, poderíamos adicionar um número único (id) a cada cavaleiro e exigir que os bloqueios fossem adquiridos do id maior para o menor."

Exemplo
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;
   }
  }
 }
}

"Essa é uma bela solução."

"É uma solução muito simples, mas eu gosto. Espero que seja útil para você quando estiver pensando em como resolver possíveis problemas de impasse."

"Obrigado, Ellie."