public static boolean isLockOrderNormal(final Solution solution, final Object o1, final Object o2) throws Exception {
synchronized (o1) {
Thread.sleep(1);
Thread thread1 = new Thread(new Runnable() {
public void run() {
solution.someMethodWithSynchronizedBlocks(o1, o2);
}
});
Thread thread2 = new Thread(new Runnable() {
public void run() {
synchronized (o2){
try {
Thread.sleep(1000);
}
catch (InterruptedException e){}
}
}
});
thread1.start();
Thread.sleep(1);
thread2.start();
Thread.sleep(40);
System.out.println(thread1.getState());
System.out.println(thread2.getState());
На текущем моменте, если объекты блокируются в прямом порядке, то второй тред блочит o2, и переходит в TIMED_WAITING, так как первый тред ждет пока разблокируется o1. Если в обратном порядке, то оба треда будут в BLOCKED.
Проверить легко.
if(thread2.getState() == Thread.State.TIMED_WAITING)return true;
else return false;
или
if(thread2.getState() == Thread.State.BLOCKED)return false;
else return true;
Но почему первый пункт не проходит? У меня программа выдает стабильно нормальный результат.