Определяем порядок захвата монитора

  • 14
  • Недоступна
Реализуй логику метода isLockOrderNormal, который должен определять: соответствует ли порядок synchronized блоков в методе someMethodWithSynchronizedBlocks - порядку передаваемых в него аргументов. В случае, если сначала происходит синхронизация по o1, а потом по o2, метод должен вернуть true. Если
Вы не можете решать эту задачу, т.к. не залогинены.
Комментарии (108)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий вы должны авторизоваться
Kazbek28 уровень, Москва
воскресенье, 21:17
Добавил подмену System.out чтобы в консоль не выводился текст лишний
S3R3N1TY29 уровень, Санкт-Петербург
пятница, 21:19
В начале (до комментов) пробовал решить через рефлексию. 1. Получил метод в котором нужно проверить порядок:
Method method = solution.getClass().getDeclaredMethod("someMethodWithSynchronizedBlocks",Object.class,Object.class);
2. Получил параметры метода. И потом думал как их дальше найти в синхронайз-блоках. Но такого способа движения по коду не нашел.
Dmitry Deryuga29 уровень
5 марта, 10:56
Не удаляйте в нитях строку "System.out.println(obj1 + " " + obj2);" Задача требует вывод в консоль только результата метода "isLockOrderNormal", но валику на это "все равно"...
Дмитрий К.31 уровень, Иркутск
4 марта, 06:14
немного не понятно ... предположим что кто-то унаследовался от нашего класса Solution и переписал метод так
synchronized (obj2) {
            synchronized (obj1) {
                System.out.println(obj1 + " " + obj2);
            }
        }
Мы нашим методом isLockOrderNormal проверили что блокировка объектов происходит не правильно и вернули false, но наши две нити так и повисли в deadlock-е .... надо в условии задачи еще предусмотреть чтобы две нити завершились исправно ... а как выйти из дедлока без применения сторонних методов блокировки по Object или Lock ??
Andrii Gorshunov35 уровень
5 февраля, 00:02
Решилась спустя час по подсказке Даня Кельвич (внизу)
Денис Дворецкий38 уровень, Минск
24 января, 17:11
Маааааленькая подсказка ;) Для проверки своего решения меняйте местами объекты в synchronized блоках метода someMethodWithSynchronizedBlocks. Я надеюсь станет понятнее чего от вас хотят :)
Джонни35 уровень
8 января, 09:31
Задача называется: Пишем свой валидатор.
Vitaly Khan35 уровень
7 января, 12:48
знатная головоломка... долго с ней просидел. аж три sleep пришлось использовать, чтобы результат был корректный всегда. первый: между запусками двух вспомогательных нитей, например, 50 мс. чтобы первая (с нашим порядком локов) гарантированно запускалась раньше. второй: внутри первой нити, чтобы после захвата первого лока нить гарантированно уступала ход второй нити. здесь ожидание должно быть обязательно более 50 мс. я ставил 100. третий: в основной нити, чтобы точно дать возможность выполниться вспомогательным нитям (если у них нет дедлока). также, на мой взгляд, правильно вспомогательные нити делать демонами (чтобы при дедлоке программа тоже завершалась). но валидатор этого не требует.
Ruslan28 уровень
18 декабря 2018, 20:13
Вы решили задачу лучше, чем 1% учеников. Вам удалось ее решить с 48 попытки. Среднее количество попыток для этой задачи 4.53. Всего эту задачу решили 3269 учеников. //:
Serj41 уровень, Киев
9 ноября 2018, 01:27
решил через 3 нити, валли принял: -основная нить блокирует о1 -2я нить запускает someMethodWithSynchronizedBlocks -3я нить пытается заблокировать о2 в основной нити выводим состояние 3й нити
Евгений35 уровень, Москва
11 января, 17:30
Спасибо огромное! До этого пытался допинать способ с двумя нитями, он работал корректно, но для true выводил еще System.out.println( obj1 + " " + obj2 ); А этот вариант вообще огонь - с первого раза без всяких танцев с бубном и лишнего вывода на экран.