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

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

Открыта
Стратегии избегания 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, 13:13
Задача "Убираем deadLock используя открытые вызовы" Просто выполняем то что указано в требования, этого достаточно )
Павел
Уровень 19
Expert
23 октября 2023, 16:23
Наконец-то... Смешной юмор. Даже если на аватаре у Элли старая фотка уважаю ее за наиболее адекватные лекции.
Евгений Frontend Developer
13 сентября 2022, 05:50
Делал то что написано в требованиях по пунктам
public void revalidate() {
    activeApartments.clear();
    for (Apartment apartment : allApartments) {
        synchronized (apartment) {
            boolean randomValue = Math.random() * 2 % 2 == 0;
            apartment.revalidate(randomValue);
        }
    }
}
КонстантинQA Engineer в TGI - ITExpert
10 июля 2022, 11:59
"Смотрю в книгу — вижу фигу!"
jvatechsBackend Developer в Ищу стажировкуExpert
19 марта 2023, 04:10
а сейчас понимание чутку улучшилось?
КонстантинQA Engineer в TGI - ITExpert
19 марта 2023, 09:08
Сейчас еще больше все запутано)