Делал по этой подсказке "Все оказалось просто. Создаем 2 нити. В первой создаем synchronized по о1, потом слип на 500 мс, внутри ставим второй synchronized по о2. Во второй нити просто вызываем someMethodWithSynchronizedBlocks(o1, o2); запускаем первую нить, запускаем вторую нить и ставим на паузу на 2 секунды. Проверяем состояние второй нити: если НЕ blocked - возвращаем тру, иначе фолс. Логика такова. Мы специально создаем дедлок. Если в даном нам методе синхронизация происходит сначала по 1 объекту, потом по 2, значит дедлока не будет и наш метод просто подождет немного и выполнится, иначе образуется дедлок и вторая нить станет BLOCKED. Надеюсь понятно объяснил)"