Почему `synchronized (блокировка)` была введена дважды разными потоками? - PullRequest
0 голосов
/ 14 ноября 2018

В этом простом примере у меня есть два synchronized (theLock), к которым обращаются разные потоки

public class Main {

    public static void main(String[] args) throws InterruptedException {
        System.out.println("start");

        final Object theLock = new Object();

        synchronized (theLock) {
            System.out.println("main thread id : " + Thread.currentThread().getId());

            new Thread(() -> {
                System.out.println("new thread id : " + Thread.currentThread().getId() + ". Inside thread");

                // before entering this section new thread should be blocked as `theLock` is already acquired
                synchronized (theLock) {
                    System.out.println("inside synchronized");
                    theLock.notify();
                }
            }).start();

            theLock.wait();
        }

        System.out.println("end");
    }
}

Почему недавно созданный поток может получить доступ к разделу synchronized (theLock) внутри?Насколько я понимаю, theLock уже получен основным потоком, а новый должен блокироваться навсегда.Вместо этого я вижу, что это также входит в synchronized.

Вот вывод

start
main thread id : 1 
new thread id : 13. Inside thread
inside synchronized
end

1 Ответ

0 голосов
/ 14 ноября 2018

Звонок на wait() снимает блокировку. За wait() Javadoc (выделение жирным шрифтом):

Заставляет текущий поток ждать, пока другой поток не вызовет метод notify() или notifyAll() для этого объекта.Другими словами, этот метод ведет себя точно так же, как если бы он просто выполнял вызов wait(0).

Текущий поток должен владеть монитором этого объекта. Поток освобождает владельца этого монитора и ожидает, пока другой поток не уведомит потоки, ожидающие на мониторе этого объекта, чтобы он проснулся либо посредством вызова метода notify, либо метода notifyAll.Затем поток ожидает, пока не получит право собственности на монитор, и возобновит выполнение.

...