Strategie unikania zakleszczenia — 1

Witaj Amigo!

Chcę opowiedzieć o kilku strategiach unikania impasu.

Najlepszą strategią jest dobrze przemyślana architektura i zestaw reguł określających, kiedy można używać blokad (pozyskiwanie muteksów) iw jakiej kolejności. Klasycznym sposobem radzenia sobie z tym problemem jest opracowanie hierarchii zamków, w której przyjmuje się zasadę, że niektórych zamków nigdy nie można uzyskać w stanie, w którym inne zamki są już nabyte.

Czasami na przykład zamki są wyrównane, co wymaga, aby nić uzyskała zamki w kolejności od najwyższego poziomu do najniższego, ale nie odwrotnie. Niemożliwe jest również przejęcie kilku zamków tego samego poziomu.

Na przykład w poprzednim przykładzie dotyczącym rycerzy każdemu rycerzowi można nadać unikalny numer (id) i wymagać, aby blokady następowały od wyższego id do niższego.

Przykład
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;
   }
  }
 }
}

- Dobra decyzja.

To bardzo proste rozwiązanie, ale mi się podoba. Mam nadzieję, że przyda Ci się, gdy będziesz myślał o tym, jak rozwiązać ewentualne problemy z zakleszczeniami.

Dzięki, Ellie.