В ниже код, который я пытаюсь выяснить темы обрабатывать выполнение на синхронизированных блоков:Thread последовательность выполнения синхронизированного блока
public class ThreadExp {
public static void main(String[] args) throws InterruptedException {
MyRunnable r = new MyRunnable();
Thread t1 = new Thread(r, "Thread1");
Thread t2 = new Thread(r, "Thread2");
t1.start();
t2.start();
}
}
class MyRunnable implements Runnable {
@Override
public void run() {
callFn();
}
private void callFn() {
System.out.println(Thread.currentThread().getName() + ": entered callSync()");
synchronized (Thread.currentThread()) {
System.out.println(Thread.currentThread().getName() + ": inside sync");
try {
Thread.currentThread().sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + " leaving sync");
}
System.out.println(Thread.currentThread().getName() + ": leaving callSync()");
}
}
Actual Выход:
Thread1: entered callFn()
Thread2: entered callFn()
Thread1: inside sync block
Thread2: inside sync block
// 5000 millisec sleep
Thread2 leaving sync block
Thread1 leaving sync block
Thread2: leaving callFn()
Thread1: leaving callFn()
В то время как я ожидал чего-то например:
Thread1: entered callFn()
Thread2: entered callFn()
Thread1: inside sync block
// 5000 millisec sleep
Thread1 leaving sync block
Thread1: leaving callFn()
Thread2: inside sync block
Thread2 leaving sync block
Thread2: leaving callFn()
В целом я думал, что Thread1 приобретет замок, а затем перейдет спать. И только после завершения Thread1 Thread2 может ввести синхронизированный блок.
Синхронизация по току объект потока будет * никогда * блокировать. Как это могло быть? Конфликт возникает, когда несколько потоков пытаются ввести блокировку, но в вашем случае каждый поток вводит уникальный замок. – dlev