Синхронизированный метод в Java - PullRequest
1 голос
/ 26 апреля 2010

У меня есть вопрос. В следующем коде, если поток был заблокирован в операторе ожидания, а другой поток пытается выполнить foo (), будет ли напечатано сообщение hello world? и почему?

synchronized foo(){
    system.out.println("hello world");
    .....
    wait();
    .....
}

Ответы [ 3 ]

3 голосов
/ 26 апреля 2010

Чтобы поток мог ввести метод foo, он должен иметь блокировку для объекта (монитора), который содержит метод foo. Когда wait выполняется, поток снимает блокировку на мониторе. Так что, если другой поток попытается выполнить foo и (скажем, он может получить блокировку), он выведет сообщение «Hello World»

1 голос
/ 26 апреля 2010

Также рекомендуется обернуть вызов wait () через некоторое время.Причина: спорадическое пробуждение!

1 голос
/ 26 апреля 2010

Да.

ожидание (); отказывается от монитора, так что да, если поток A заблокирован в wait (); , Поток B сможет войти в foo и напечатать hello world

...