
"Ciao, Amico!"
"Voglio parlarti di un paio di strategie per evitare situazioni di stallo."
"La migliore strategia è un'architettura ponderata e un insieme di regole che stabiliscono quando e in quale ordine è possibile utilizzare i blocchi (acquisire mutex). L'approccio classico al problema è sviluppare una gerarchia di blocchi e stabilire la regola secondo cui determinati blocchi non possono mai essere acquisita in uno stato in cui sono già state acquisite altre serrature."
"Ad esempio, a volte ai blocchi vengono assegnati livelli ed è necessario un thread per acquisire blocchi in ordine dai livelli superiori a quelli inferiori (ma l'acquisizione di blocchi nell'altra direzione non è consentita). Inoltre, l'acquisizione di più blocchi con lo stesso livello non è consentita consentito."
"Ad esempio, nell'esempio precedente con i cavalieri, potremmo aggiungere un numero univoco (id) a ciascun cavaliere e richiedere che i blocchi vengano acquisiti dall'id più grande all'id più piccolo."
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;
}
}
}
}
"Questa è una bella soluzione."
"È una soluzione molto semplice, ma mi piace. Spero che ti sarà utile quando penserai a come risolvere potenziali problemi di stallo."
"Grazie, Eli."