Проверка работает. Что не нравится? и еще вопрос: почему если вместо
Thread t = new Thread(){
                private Object o1_1=o1,o1_2=o2;
                private Solution solution_1=solution;
                @Override
                public void run() {
                    solution.someMethodWithSynchronizedBlocks(o1_1, o1_2);
                }
            };
            t.start();
написать
Thread t = new Thread(()->{solution.someMethodWithSynchronizedBlocks(o1, o1);});
t.start();
и изменить synchronized (o1) на synchronized (o2), то новый поток проходит не останавливаясь на мониторе? т.е. на проверке t.getState()== Thread.State.BLOCKED состояние уже Terminated. Подозреваю, что лямбда не зацепляет параметры, хотя они и объявлены как final. для synchronized (o1) нить из лямбды останавливается на входе в монитор.