
"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."
GO TO FULL VERSION