Я совсем не понял задачу.
Мы тестируем порядок блокировки... Но кто блокирует то? Т.е. Я не понимаю, что в принципе должен делать метод isNormalLockOrder. По условию понятно, он должен возвращать true, если блокировка идет от o1 к o2 и false, если наоборот. Но!!! Кто и когда должен вызывать неправильную блокировку? Т.е. Мы передаём в метод isNormalLockOrder объект solution и два объекта o1 и o2, а потом что?! Почему метод someMethodWithSynchronizedBlocks должен вдруг сначала заблокировать объект o2 вместо o1, если мы его вызовем с параметрами (o1, o2)? В каком месте они могут перепутаться? Если метод someMethodWithSynchronizedBlocks вызвать с параметрами (o1, o2), то он их с таком порядке и заблокирует иначе никак. Только есть в другой нити его вызвать с параметрами (o2, o1), он попытается заблокировать сначала o2, потом o1, но и такое поведение не противоречит его логике.
Мой мозг отказывается это понимать. Что мы должны протестировать? Может мне кто-нибудь объяснить?
hidden #228406
41 уровень
Не понимаю задачу
Решен
Комментарии (3)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
kotdavinci
15 апреля 2018, 19:42
Для тестирования вы должны менять порядок блокировки в методе someMethodWithSynchronizedBlocks, а в методе main выполнять примерно следующий код
p.s. на данный момент моя программа ловит deadlock в случае false. либо валидатору на это пофиг, либо я что-то менял после решения.
0
hidden #228406
16 апреля 2018, 04:42
А при проверке на правильность метод someMethodWithSynchronizedBlocks должен выполняться или нет?
Я немного подумал, и решил, что это нужно вот для чего:
Кто-то унаследовался от нашего класса и переопределил метод someMethodWithSynchronizedBlocks, задав в нем другой порядок блокировки. А метод isNormalLockOrder должен нам подсказать, можно ли выполнять метод someMethodWithSynchronizedBlocks, т.е. правильный ли поряток он реализует. Но вот в чем вопрос, при проверке метод someMethodWithSynchronizedBlocks должен выполняться ли нет?
Скажем мы заблокировали объект o1, потом вызываем метод someMethodWithSynchronizedBlocks, который пытается заблокировать o1 или o2 в зависимости от своей реализации. Если у него получилось заблокировать o2, значит порядок не верный, но нить будет заблокирована, так как не сможет получить объект o1. В общем нужно ли выполнять до конца метод someMethodWithSynchronizedBlocks, если мы определили верный ли порядок?
p.s. может не совсем понятно получилось объяснить суть проблемы. В общем буду пытаться решить как-нибудь. Хотя практическая суть задачи мне не ясна. :)
0
kotdavinci
17 апреля 2018, 20:58
У меня в случае с false как раз на вызове метода someMethodWithSynchronizedBlocks программа ловит deadlock, естественно до конца он не выполняется.
Сложно сейчас сказать принялось ли именно это решение валидатором.
Если честно, я вообще не думал о том, будет ли кто-то наследоваться от нашего класса и т.д. Тут в задачах чем больше думаешь о всяких проверках на null и других необходимых в реальной жизни вещах, тем хуже валидатор эти задачи принимает. Не говоря уж о том, что предложенная нам логики решения некоторых задач мне вообще не нравится. Например было желание полностью по своему переписать чат из задачи com.javarush.task.task30.task3008, но пожалел время.
0