JavaRush /Курсы /Модуль 2. Java Core /Стратегии избегания DeadLock

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

Модуль 2. Java Core
12 уровень , 6 лекция
Открыта
Стратегии избегания 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;
   } 
  }
 }
}

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

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

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

Комментарии (6)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Алексей Уровень 68 Expert
30 марта 2024
Задача "Убираем deadLock используя открытые вызовы" Просто выполняем то что указано в требования, этого достаточно )
Павел Уровень 19 Expert
23 октября 2023
Наконец-то... Смешной юмор. Даже если на аватаре у Элли старая фотка уважаю ее за наиболее адекватные лекции.
Евгений Уровень 90
13 сентября 2022
Делал то что написано в требованиях по пунктам

    public void revalidate() {
        activeApartments.clear();
        for (Apartment apartment : allApartments) {
            synchronized (apartment) {
                boolean randomValue = Math.random() * 2 % 2 == 0;
                apartment.revalidate(randomValue);
            }
        }
    }
Константин Уровень 100 Expert
10 июля 2022
"Смотрю в книгу — вижу фигу!"
jvatechs Уровень 111 Expert
19 марта 2023
а сейчас понимание чутку улучшилось?
Константин Уровень 100 Expert
19 марта 2023
Сейчас еще больше все запутано)