"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."
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."