undefined

Стратегии избегания DeadLock

Java Multithreading
7 уровень , 5 лекция
Доступна
Стратегии избегания DeadLock - 1

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

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

Самая лучшая стратегия – это продуманная архитектура и набор правил, когда можно использовать блокировки (захват мютексов) и в каком порядке. Классический способ борьбы с проблемой — разработка иерархии блокировок, установление правила, что некоторые блокировки никогда не могут захватываться в состоянии, в котором уже захвачены какие-то другие блокировки.

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

Например, в предыдущем примере про рыцарей, каждому рыцарю можно добавить его уникальный номер (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;
   } 
  }
 }
}

— Красивое решение.

— Это очень простое решение, но мне нравится. Надеюсь, оно тебе пригодится, когда ты будешь думать, как решать возможные проблемы с дедлоками.

— Спасибо, Элли.

Комментарии (31)
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION
Anonymous #2481357 Уровень 37
10 апреля 2021
Проще говоря, надо создать порядок в стохастическом процессе) Как на физкультуре: - Рыцари на первый-второй рассчитайсь! Первые номера бьют вторые, потом меняются.
Евгений Уровень 29 Россия
6 февраля 2021
пол часа разбирался что же это за неправильная лямда 😅

  Knight knightMax = knight1.id > knight2.id ? knight1: knight2;
  Knight knightMin = knight1.id > knight2.id ? knight2: knight1;
Kex Уровень 38 Тольятти Expert
1 июня 2020
https://javarush.ru/groups/posts/1422-vzaimnaja-blokirovkadeadlock-v-java-i-metodih-borjhbih-s-neyhttps://javarush.ru/groups/posts/1422-vzaimnaja-blokirovkadeadlock-v-java-i-metodih-borjhbih-s-ney в дополнение к прочтению о блокировках!
Kex Уровень 38 Тольятти Expert
1 июня 2020
интересный подход и вполне логичный, давно задаю себе этот вопрос - про обход блокировок, и вот, наконец то один из вариантов обхода у меня в кармане)
Зарубин Илья Уровень 33 Воронеж
29 апреля 2020
Хоть убей не прнятно как это работает...предъидущие задачи на полуинтуитивном уровне решил.
Евгений Буш Уровень 35 Санкт-Петербург Россия Expert
6 января 2020
ассоциируется с написанием правил сортировки
Артём Уровень 41
4 января 2020
ну прям очень интересно..
Alexey Ilyin Уровень 41 Смоленск Россия
7 декабря 2019
Вроде что то начинает вкрадываться в мозг 😁 например прочитав это пояснение пришла идея формировать ИД зависимым от момента возникновения события для использования синхро-блока чтоб их как то упорядочить. Согласно описанию выше у рыцарь с низким ИД относительно остальных будет несправедливо меньше шансов победить.
Павел Уровень 29 Санкт-Петербург Россия Expert
8 ноября 2019
ниечего вообще не понятно
hidden #2039138 Уровень 35
14 августа 2019
типа если судить по комментарию сергея, то почему knoght2 вызывается первее 1? Или синх в синхе оптимизируют это дело и могут выполняться последовательно?