Проверка работает. Что не нравится?
и еще вопрос: почему если вместо
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) нить из лямбды останавливается на входе в монитор.package com.javarush.task.task27.task2707;
/*
Определяем порядок захвата монитора
*/
import java.lang.management.ManagementFactory;
import java.lang.management.ThreadInfo;
import java.lang.management.ThreadMXBean;
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
synchronized (o1){
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();
String tName=t.getName();
while(true){
Thread.sleep(100);
if(t.getState()== Thread.State.BLOCKED){
ThreadMXBean bean = ManagementFactory.getThreadMXBean();
ThreadInfo[] ti = bean.getThreadInfo(bean.getAllThreadIds(), true, true);
for (int i = 0; i < ti.length; i++) {
ThreadInfo tInf = ti[i];
if(tInf.getThreadName().equals(tName)){
if(tInf.getLockedMonitors().length==0){
return true;
}
else
return false;
}
}
}
}
}
}
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));
}
}