Помогите, пожалуста, "чайнику в java" разобраться.
1. Блок synchronized(...) является критической секцией — это значит, что в любой момент времени не больше одного потока может находится внутри критической секции в активном состоянии.
2. Функция wait() может вызыватся только внутри synchronized(...) блока и переводит поток, её вызвавший в блокированное состояние.
3. Функция notify() может вызыватся только внутри synchronized(...) блока и переводит один из ждущих потоков из блокированного состояния в активное. Однако пробуждённый поток не может выполнятся пока "будильник" не освободит блокировку объекта.
4. Функция notifyAll() аналогична notify(), только она пробуждает не один, а все потоки ожидающие данный объект.
Теперь вопросы:
1. Я всё правильно описал выше?
2. Что происходит с пробуждёнными потоками после notifyAll()? Они по очереди выходят из wait() и выполняются либо до конца synchronized(...), либо до следующего wait()? Или как-то по другому?
Заранее спасибо.
Re: Вопросы по synchronized, wait, notify, notifyAll
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()? Или как-то по другому?
Они пробуждаются и пытаются захватить монитор (который все еще вероятно во власти "будильника"). Одному из проснувшихся тредов это удастся. Все проснувшиеся треды конкурируют за монитор между собой и с остальными (возможно) тредами которые пытаются захватить этот монитор.