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