Не могу понять!
Запускаю в отдельном потоке метод someMethodWithSynchronizedBlocks на объекте
Runnable runnable = new Runnable() {
@Override
public void run() {
try {
solution.(o1,o2);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
Thread thread = new Thread(runnable);
thread.setName("Моя новая нить");
thread.start();
при в ходе в этот метод блокируется монитор o1 и метод ждет 10 секунд вывод
результат Thread.holdsLock(obj1) == true
Thread.holdsLock(obj2) == false
В этот момент метод isNormalLockOrder начинает работу,
проверяю в нем объекты на лок
System.out.println(Thread.holdsLock(o1)); == false
System.out.println(Thread.holdsLock(o2)); == false
как работает этот метод? и почему из разных методов разные результаты holdsLock.
public class Solution {
private static Thread thread1 = null ;
private static Thread thread2 = null ;
public void someMethodWithSynchronizedBlocks(Object obj1, Object obj2) throws InterruptedException {
synchronized (obj1) {
System.out.println(Thread.currentThread().toString()+"Зашли в блок нити obj1 "+ Thread.currentThread()+" Ждем 10 секунд...");
System.out.println(thread2.holdsLock(obj1));
System.out.println(thread2.holdsLock(obj2));
System.out.println(thread1.holdsLock(obj1));
System.out.println(thread1.holdsLock(obj2));
Thread.sleep(10000);
synchronized (obj2) {
System.out.println("Зашли в блок нити obj2 "+ Thread.currentThread()+" Ждем 10 секунд...");
System.out.println(thread2.holdsLock(obj1));
System.out.println(thread2.holdsLock(obj2));
System.out.println(thread1.holdsLock(obj1));
System.out.println(thread1.holdsLock(obj2));
Thread.sleep(10000);
}
}
}
public static boolean isNormalLockOrder(final Solution solution, final Object o1, final Object o2) throws Exception { Thread.sleep(2000);
System.out.println(Thread.currentThread().toString()+"Зашли в проверку нитей " );
System.out.println(thread2.holdsLock(o1));
System.out.println(thread2.holdsLock(o2));
System.out.println(thread1.holdsLock(o1));
System.out.println(thread1.holdsLock(o2));
synchronized (o1){
System.out.println("1 В блокеровке первого обхекта");
System.out.println(thread2.holdsLock(o1));
System.out.println(thread2.holdsLock(o2));
System.out.println(thread1.holdsLock(o1));
System.out.println(thread1.holdsLock(o2));
synchronized (o2) {
System.out.println("1 В блокеровке второго обхекта");
System.out.println(thread2.holdsLock(o1));
System.out.println(thread2.holdsLock(o2));
System.out.println(thread1.holdsLock(o1));
System.out.println(thread1.holdsLock(o2));
}} synchronized (o2){
System.out.println("2 В блокеровке Второго обхекта");
System.out.println(thread2.holdsLock(o1));
System.out.println(thread2.holdsLock(o2));
System.out.println(thread1.holdsLock(o1));
System.out.println(thread1.holdsLock(o2));
synchronized (o1) {
System.out.println("2 В блокеровке Первого обхекта");
System.out.println(thread2.holdsLock(o1));
System.out.println(thread2.holdsLock(o2));
System.out.println(thread1.holdsLock(o1));
System.out.println(thread1.holdsLock(o2));
}}
return true; }
public static void main(String[] args) throws Exception {
thread2 = Thread.currentThread();
final Solution solution = new Solution();
final Object o1 = new Object();
final Object o2 = new Object();
Runnable runnable = new Runnable() {
@Override
public void run() {
try {
solution.someMethodWithSynchronizedBlocks(o1,o2);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
thread1 = new Thread(runnable);
thread1.setName("Моя новя нить");
thread1.start();
Thread.sleep(150);
System.out.println(isNormalLockOrder(solution, o1, o2));
}
}