Как стать автором
Обновить

Комментарии 15

Визуализация потрясающая! Спасибо!
Сразу возник вопрос к примеру с парковкой, где используется семафор. Не будет ли тут race condition? Вы ведь пускаете 5 потоков сразу. Один поток проверит наличие свободного места, второй поток так же одновременно проверит наличие свободного места и обе машины встанут на одно и тоже место.
Семафоры — самый простой способ решения проблем с доступом к критической секции, если абстрагироваться от Java.
За ними мониторы — примерно то же самое, только с очередями.

Ну и остальные структуры, которые описаны в статье для решения разного рода задач синхронизации потоков.

Семафор
Монитор
Что касается проверки свободного места, то это уже в рамках критической секции нужно выполнять. Например, закрыли семафор, проверили место на диске, выполнили операцию, открыли семафор. Так второй поток будет заблокирован в момент, когда попытается закрыть семафор, если он уже закрыт, и будет разблокирован, когда семафор откроется. Таким образом проверка свободного места на диске будет выполняться в рамках одного потока.
Это понятно, но в данном конкретном примере с парковкой есть ошибка.
Ааа. А я посчитал, что пример априори верный, просто я что-то не понимаю.
Спасибо!
Спасибо, исправился.
Каждый раз, когда я вижу потоки переведенные как "нити", у меня дергается глаз.
Ужасные примеры с кучей ошибок.

  1. В примере Semaphore парковка не синхронизирована между заехавшими на неё автомобилями. В результате несколько автомобилей могут одновременно занять одно место.
  2. Неудачный пример CountDownLatch: команды "Внимание", "Марш" могут быть даны ещё до прибытия автомобилей на старт, при этом команда "Марш" сама не является сигналом к началу гонки.
  3. С Phaser вообще беда. В обоих циклах while очевидный race condition: фаза может измениться после проверки условия. Вообще, конструкция phaser.awaitAdvance(phaser.getPhase()) не имеет смысла по причине своей неатомарности. Кроме того, в примере пассажир может пропустить автобус, даже если пришёл на остановку вовремя.

Добавлю, что давать ссылки на документацию по Java 7 (устаревшую) — плохой тон. И, как уже было замечено, в русском языке thread принять переводить "поток", а не "нить".
Смотрю, уже почти всё исправили. Так гораздо лучше, правда.
Вообще, здорово, что такие понятия показаны на понятных бытовых примерах. Спасибо, и плюс в карму!
Отличная штука, спасибо!
Спасибо! Хорошие примеры

Отличная статья! Спасибо! И примеры очень наглядные.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории