JavaRush /Курси /Java Multithreading /Стратегії уникання DeadLock

Стратегії уникання DeadLock

Java Multithreading
Рівень 7 , Лекція 5
Відкрита

— Привіт, Аміго!

Хочу розповісти тобі про декілька стратегій уникання дедлоків.

Найкраща стратегія – це продумана архітектура й набір правил щодо того, коли можна використовувати блокування (захопленя м'ютексів) та в якому порядку. Класичний спосіб боротьби з проблемою — розробка ієрархії блокувань, встановлення правила, що деякі блокування ніколи не можуть бути захопленими в стані, в якому вже захоплено якісь інші блокування.

Інколи, наприклад, блокуванням присвоюють рівні, і водночас вимагають від потоку захоплювати блокування в порядку від більшого рівня до меншого, але не в зворотному. Також не можна захоплювати кілька блокувань одного рівня.

Давай згадаємо попередній приклад про лицарів. Кожному лицарю можна додати унікальний номер (id) і вимагати, щоб блокування здійснювалися від більшого id до меншого.

Приклад
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;
   } 
  }
 }
}

— Гарне рішення.

— Це дуже просте рішення, але мені воно подобається. Сподіваюся, воно тобі стане у пригоді, коли будеш думати, яким чином краще вирішити можливі проблеми з дедлоками.

— Дякую.

Коментарі (1)
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ
26 серпня 2025
спочатку сидів хвилин 15 і не міг поняти, в чому суть такого підходу.. в моїх очах ці порівняння були одинаковими... а аж потім побачив, що вони по суті дзеркальні)) якщо один потік викличе (лицар 1, лицар 2), а інший (лицар 2, лицар 1) - то в обох випадках порядок лицарів буде одинаковий для обох потоків і другий потік фізично не зможе отримати доступ до монітора.. схоже, пора спати)) утро вечера мудренее