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;
Но почему первый пункт не проходит? У меня программа выдает стабильно нормальный результат.