Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Идеология методов wait, notify, notifyAll. 
:(
    Опции темы
Bakuard
Дата 1.10.2017, 12:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 8.7.2017

Репутация: нет
Всего: нет



Доброго времени суток.

Возникло несколько вопросов связанных с поведением методов wait, notify, notifyAll. Сразу хочу уточнить - я понимаю как работают эти методы, но не понимаю, почему разработчики языка решили реализовать именно такое поведение. 
А именно: Почему для вызовов этих методов необходимо владеть монитором объекта? Почему эти методы реализованы в классе Object?
Помогите пожалуйста разобраться.
PM MAIL   Вверх
rfq
Дата 15.12.2017, 02:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 20.3.2007

Репутация: нет
Всего: нет



Параллельное программирование - это очень просто, запускай себе потоки и процессы, делов-то. Сложности начинаются, когда параллельные процессы должны взаимодействовать. Рассмотрим простейший пример:

- поток А записывает значение в переменную П
- поток Б читает это значение

Поскольку про относительную скорость потоков нам ничего не известно, то как избежать ситуации, когда Б будет читать еще не записанное значение?

Решение в том, чтобы для обмена данными использовать не простые переменные, а контейнеры токенов. Токен (token) - это фишка в настольной игре. Его можно разместить на клетке игрового поля, можно передвинуть, при этом из прежней клетки он исчезает. Фишки казино - тоже токены, они перемещаются от дилера к игроку и обратно. Конкретно в нашем случае, поток А кладет токен в контейнер К, а поток Б пытается его извлечь. При этом если токена там еще нет, поток засыпает до момента его появления. Операция размещения токенов будит ждущие потоки, если они есть.

Собственно, токен - это обычное значение, примитивного или ссылочного типа, токеном его делает контейнер, в котором он размещается. Контейнер - это объект, обеспечивающий надежную реализацию операций размещения и извлечения токенов  в многопоточной среде.

Итак, для организации контейнера токенов нам надо 3 вещи:
- блокировка контейнера на время операции - как правило, нам нужно несколько действий, чтобы разместить или извлечь токен, важно, чтобы никто во время операции не вклинивался, не только с записью, но и с чтением
- операция перехода потока в состояние ожидания события изменения состояния контейнера (поток может ждать не только размещения токена, но и освобождения места, чтобы положить свой токен)
- операция оповещения ждущих потоков о том, что состояние контейнера изменилось.

Вы, конечно, узнали операции synchronized, wait и notify.

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

Вот только я считаю, что начинать изучение параллельного программирования с написания контейнеров токенов (иными словами, с использования вышеупомянутых операций) - это неправильно. Это ответственное дело, полное подводных камней, требующее высокой квалификации. Существуют готовые реализации контейнеров, например, реализации интерфейса BlockingQueue, которые закроют ваши потребности на 90%, еще несколько процентов закроет класс Semaphore - контейнер для неразличимых токенов. Свои контейнеры нужны, если у вас возникли специфические задачи, а вы уже перепробовали все стандартные реализации и остались неудовлетворенными. И конечно, прежде чем начать писать свое, нужно изучить коды стандартных реализаций.

Это сообщение отредактировал(а) rfq - 15.12.2017, 02:14
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1045 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.