при прямом порядке в someMethod выдает true, при обратном false. В чем проблема не понимаю
package com.javarush.task.task27.task2707;
import static java.lang.Thread.sleep;
/*
Определяем порядок захвата монитора
*/
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 {
//умышленно блокирую объект o1
Thread thread1 = new Thread(() -> {
synchronized (o1) {
try {
sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
//запускаю someMethod, и в случае, если блокируется сначала o1, то o2 - он не блокируем, иначе блокирует
Thread thread2 = new Thread(() -> {
new Solution().someMethodWithSynchronizedBlocks(o1, o2);
});
//если о2 заблокирован, то состояние должно быть - blocked, иначе - terminated
Thread thread3 = new Thread(() -> {
synchronized (o2) {
try {
sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
thread1.start();
Thread.sleep(50);
thread2.start();
Thread.sleep(50);
thread3.start();
Thread.sleep(100);
return thread3.getState() == Thread.State.TERMINATED;
}
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("Lock order is normal: " + isLockOrderNormal(solution, o1, o2));
}
}