Пробовал менять местами в методе someMethodWithSynchronizedBlocks синхронизацию по второму и первому объекту - результат соответствует условиям выдачи, но валидатор все равно не принимает решения(
package com.javarush.task.task27.task2707;
/*
Определяем порядок захвата монитора
*/
public class Solution {
public void someMethodWithSynchronizedBlocks(Object obj1, Object obj2) {
synchronized (obj1) {
synchronized (obj2) {
System.out.println(obj1 + " " + obj2);
}
}
}
public static boolean isLockOrderNormal(final Solution solution, final Object o1, final Object o2) throws Exception {
//do something here
Thread baseThread = new Thread(new Runnable() {
@Override
public void run() {
try {
solution.someMethodWithSynchronizedBlocks(o1, o2);
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
Thread testThread = new Thread(new Runnable() {
@Override
public void run() {
synchronized (o2){
try {
Thread.sleep(500);
synchronized (o1){
}
}catch (InterruptedException e) {
e.printStackTrace();
}
}
}
});
testThread.start();
//Thread.sleep(500);
baseThread.start();
Thread.sleep(2000);
//System.out.println("Test - " + testThread.getState());
//System.out.println("Base - " + baseThread.getState());
if (testThread.getState() == Thread.State.BLOCKED
&& baseThread.getState() == Thread.State.BLOCKED) {
return true;
}
if(testThread.getState() == Thread.State.TERMINATED){
return false;
}
return true;
}
public static void main(String[] args) throws Exception {
final Solution solution = new Solution();
final Object o1 = new Object();
final Object o2 = new Object();
System.out.println(isLockOrderNormal(solution, o1, o2));
}
}
/*
Определяем порядок захвата монитора
Реализуй логику метода isLockOrderNormal, который должен определять:
соответствует ли порядок synchronized блоков в методе someMethodWithSynchronizedBlocks - порядку передаваемых в него аргументов.
В случае, если сначала происходит синхронизация по o1, а потом по o2, метод должен вернуть true.
Если наоборот - false.
Требования:
1. Метод isLockOrderNormal должен возвращать true в случае,
если синхронизация в методе someMethodWithSynchronizedBlocks происходит сначала по объекту o1, а потом по o2.
2. Метод isLockOrderNormal должен возвращать false в случае,
если синхронизация в методе someMethodWithSynchronizedBlocks происходит сначала по объекту o2, а потом по o1.
3. Метод isLockOrderNormal НЕ должен быть приватным.
4. Класс Solution НЕ должен быть объявлен с модификатором final.
Создаем 2 нити. В первой создаем synchronized по о1, потом слип на 500 мс, внутри ставим второй synchronized по о2.
Во второй нити просто вызываем someMethodWithSynchronizedBlocks(o1, o2);
запускаем первую нить, запускаем вторую нить и ставим на паузу на 2 секунды.
Проверяем состояние второй нити: если НЕ blocked - возвращаем тру, иначе фолс.
Логика такова. Мы специально создаем дедлок.
Если в даном нам методе синхронизация происходит сначала по 1 объекту, потом по 2, значит дедлока не будет
и наш метод просто подождет немного и выполнится,
иначе образуется дедлок и вторая нить станет BLOCKED. Надеюсь понятно объяснил)
*/