Вопросы по synchronized, wait, notify, notifyAll
От: valker  
Дата: 27.01.06 09:47
Оценка:
Здравствуйте.

Помогите, пожалуста, "чайнику в java" разобраться.
1. Блок synchronized(...) является критической секцией — это значит, что в любой момент времени не больше одного потока может находится внутри критической секции в активном состоянии.
2. Функция wait() может вызыватся только внутри synchronized(...) блока и переводит поток, её вызвавший в блокированное состояние.
3. Функция notify() может вызыватся только внутри synchronized(...) блока и переводит один из ждущих потоков из блокированного состояния в активное. Однако пробуждённый поток не может выполнятся пока "будильник" не освободит блокировку объекта.
4. Функция notifyAll() аналогична notify(), только она пробуждает не один, а все потоки ожидающие данный объект.

Теперь вопросы:
1. Я всё правильно описал выше?
2. Что происходит с пробуждёнными потоками после notifyAll()? Они по очереди выходят из wait() и выполняются либо до конца synchronized(...), либо до следующего wait()? Или как-то по другому?

Заранее спасибо.
Re: Вопросы по synchronized, wait, notify, notifyAll
От: Аноним  
Дата: 27.01.06 10:19
Оценка: 10 (4)
V>1. Блок synchronized(...) является критической секцией — это значит, что в любой момент времени не больше одного потока может находится внутри критической секции в активном состоянии.

да, входя в критическую секцию тред пытается завладеть монитром ассоциированным с объектом по которому идет синхронизация
эта операция либо проходит успешно, либо блокирует до тех пор пока монитор не освободится. если тред уже вледеет монитором он может
входить в критические секции по этому монитору, вызывать синхронизированные функции.


V>2. Функция wait() может вызыватся только внутри synchronized(...) блока и переводит поток, её вызвавший в блокированное состояние.


верно. монитор при этом освобождается и при выходе из wait() делается попытка им снова завладеть.

V>3. Функция notify() может вызыватся только внутри synchronized(...) блока и переводит один из ждущих потоков из блокированного состояния в активное. Однако пробуждённый поток не может выполнятся пока "будильник" не освободит блокировку объекта.

V>4. Функция notifyAll() аналогична notify(), только она пробуждает не один, а все потоки ожидающие данный объект.

верно.

V>Теперь вопросы:

V>1. Я всё правильно описал выше?
V>2. Что происходит с пробуждёнными потоками после notifyAll()? Они по очереди выходят из wait() и выполняются либо до конца synchronized(...), либо до следующего wait()? Или как-то по другому?

Они пробуждаются и пытаются захватить монитор (который все еще вероятно во власти "будильника"). Одному из проснувшихся тредов это удастся. Все проснувшиеся треды конкурируют за монитор между собой и с остальными (возможно) тредами которые пытаются захватить этот монитор.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.