JavaRush /Курсы /Java Multithreading /Задачи по исправлению дедлоков

Задачи по исправлению дедлоков

Java Multithreading
7 уровень , 6 лекция
Открыта

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

8
Задача
Java Multithreading, 7 уровень, 6 лекция
Недоступна
Убираем deadlock
Используя стратегию избегания deadlock-а сделай так, чтобы он не возник. Метод main не участвует в тестировании. Действуй аналогично примеру из лекций. Изменения вноси только в safeMethod.
32
Задача
Java Multithreading, 7 уровень, 6 лекция
Недоступна
Определяем порядок захвата монитора
Реализуй логику метода isLockOrderNormal, который должен определять: соответствует ли порядок synchronized блоков в методе someMethodWithSynchronizedBlocks - порядку передаваемых в него аргументов. В случае, если сначала происходит синхронизация по o1, а потом по o2, метод должен вернуть true. Если
16
Задача
Java Multithreading, 7 уровень, 6 лекция
Недоступна
Убираем deadLock используя открытые вызовы
Синхронизированные методы, которые вызывают внутри себя синхронизированные методы других классов, приводят к dead-lock-у. 1. Перенесите синхронизацию с метода в синхронизированный блок, куда поместите лишь необходимые части кода. 2. Уберите избыточную синхронизацию методов. 3. В стеке вызова методов
Комментарии (90)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Anonymous #3473304 Уровень 48
11 апреля 2025
вторая задача:
Андрей Уровень 44
16 февраля 2025
2-я задача легче чем кажется. Логика такая: 1. Сразу захватываем один из мютексов, например о1. 2. Запускаем (как демона) поток и в нем выполняем someMethodWithSynchronizedBlocks. Независимо от того в каком порядке метод захватывает мютексы, запущенный поток зависнет. Соответственно надо дождаться пока он станет BLOCKED и проверить на каком из мютексов он повис. Для этого: 3. Запускаем второй поток (демон) в котором захватываем второй мютекс, например о2 и в синхронайзд блоке устанавливаем флаг, определенный ранее где-то в классе. 4. Ждем пока второй поток не заблокируруется либо не завершится (isAlive() == false). 5. Проверяем что с флагом. Если второй поток заблокировался, то исследуемый метод сначала захватил о2, и флаг останется false. Если второй поток завершился, то он установит флаг в true и исследуемый метод сначала захватывает о1 и дает второму потоку беспрепятственно захватить о2 и установить флаг. 6. Возвращаем значение флага. В таком решении оба потока должны быть демонами, чтобы они были убиты JVM по завершении программы, а не завесили ее. Т.к. флаг используется в нескольких потоках, у него должен быть нужный модификатор.
Viktoriya Уровень 43
5 марта 2024
По поводу задач: - в начале курса - задачу решили ~ 50 000 человек; - в середине курса - задачу решили ~ 30 000 человек; - на этом этапе - задачу решили ~ 9 000 человек;
11 апреля 2024
ну это больше из-за сложности, длительности прохождения курса, ну и качества. 50% просто не успевают за год даже 2 квеста пройти, некоторые просто забрасывают
wokku Уровень 51
20 августа 2023
2 = epic🙃
Anonymous #3473304 Уровень 48
11 апреля 2025
true
hint1k Уровень 51
8 апреля 2023
Указанные уровни сложности не соответствуют действительности: 1 задача = medium 2 задача = epic (не советую тратить на нее время, поскольку она ничему не учит и не имеет никакой практической пользы) 3 задача = easy
pel7373 Уровень 41 Expert
16 июля 2023
Относительно 1-й задачи - не согласен, что медиум. Именно изи - т.к. надо просто повторить ту же идею, что на лекции на предыдущей странице. Только сравнить два объекта. Хоть они и Object. Что сразу приходит на ум (как сравнивать) - преобразовать в стринг и сравнить 2 стринга через compareTo :)
kalkulator¹ Уровень 51
2 февраля 2023
розкажіть в леції про демон ниткі 🧦
Наида Уровень 41
16 октября 2022
Надеюсь когда-нибудь придет понимание всего этого((
Виктор Уровень 1
25 сентября 2022
Суть проблемы во второй задаче. Не всегда у вас будет дедлок при существующем коде. Вот, например, здесь у меня нет дедлока из-за того, что компьютер успевает обработать первую нить и освободить монитор:

Thread thread1 = new Thread(new Runnable() {
            @Override
            public void run() {
                solution.someMethodWithSynchronizedBlocks(1,2);
            }
        });
        Thread thread2 = new Thread(new Runnable() {
            @Override
            public void run() {
                solution.someMethodWithSynchronizedBlocks(2,1);
            }
        });
        thread1.start();
        thread2.start();
дедлок я смог получить только поставив паузу в someMethodWithSynchronizedBlocks

synchronized (obj1) {
            try { Thread.sleep(100);
            } catch (InterruptedException e) { }
            synchronized (obj2) {
                System.out.println(obj1 + " " + obj2);
            }
        }
но в решении задачи мне это не помогло. В конце концов валидаотр принял решение, которое у меня всегда выдавало true. P.S. если кого-то волнуют "зависшие" потоки, то сделайте их демонами и все дела.
Виктор Уровень 1
25 сентября 2022
По первой задаче вопрос. Теоретически может быть ситуация, при которой хэш коды, при pазных объектах равны. В таком случае мы по идее тоже словим deadlock.
Антон Власов Уровень 42
31 августа 2022
мало ли кому логика нужна простая и рабочая: synchronized (o2) { synchronized (o1) { thread1.start(); Thread.sleep(1); } отпускаем о1 и даем возможность первому потоку зайти в о1, если он может конечно Thread.sleep(1); thread2.start(); второй поток захватывает о1 если он свободен и должен все дела свои сделать, если же не захватит, то будет заблокирован, т.к. первый на нем сидит, что значит порядок верен Thread.sleep(1); flag = Thread.State.BLOCKED.equals(thread2.getState()); }