Почему изменчивое чтение всегда безосновательно?

Цитата из книги Java-параллелизма на практике:

Стоимость синхронизации зависит от нескольких источников. Гарантии видимости, предоставляемые синхронизированными и изменчивыми, могут включать использование специальных инструкций, называемых барьерами памяти, которые могут очищать или аннулировать кэши, очищать аппаратные буферы записи и блокировать конвейеры выполнения. Барьеры памяти могут также иметь косвенные последствия для производительности, поскольку они препятствуют оптимизации других компиляторов; большинство операций нельзя переупорядочить с помощью барьеров памяти. При оценке влияния синхронизации на производительность важно различать состязательную и незапланированную синхронизацию. Синхронизированный механизм оптимизирован для непредусмотренного случая (энергозависимость всегда непредсказуема), и при этой записи затраты на производительность неконтролируемой синхронизации "быстрого пути" варьируются от 20 до 250 тактовых циклов для большинства систем.

Вы можете уточнить это более ясно? Что делать, если у меня есть огромное количество потоков, которые читают переменную volaile?

Можете ли вы дать определение конкуренции?

Есть ли инструмент для определения разногласий? В каких ценностях это меры?

1 ответ

Вы можете уточнить это более ясно?

Это один плотный абзац, который затрагивает множество тем. Какую тему или темы конкретно вы просите уточнить? Ваш вопрос слишком широк, чтобы ответить удовлетворительно. Сожалею.

Теперь, если вы задаете вопрос о несанкционированной синхронизации, это означает, что потоки в JVM не должны блокироваться, получать разблокировку / уведомление и затем возвращаться в заблокированное состояние.

Под капотом JVM использует аппаратные барьеры памяти, которые обеспечивают

  1. volatile поле всегда читается и записывается в / из основной памяти, а не из кэша ЦП / ядра и
  2. Ваш поток не будет блокировать / разблокировать доступ к нему.

Там нет споров. Когда вы используете синхронизированный блок OTH, все ваши потоки находятся в заблокированном состоянии, кроме одного, которое читает все данные, которые защищены синхронизированным блоком.

Давайте назовем этот поток, который обращается к синхронизированным данным, потоком А.

Теперь вот кикер, когда поток A завершает работу с данными и существует синхронизированный блок, это заставляет JVM пробуждать все другие потоки, которые ожидают / ожидают, чтобы поток A вышел из блока синхронизации.

Все они просыпаются (и это дорого с точки зрения использования процессора / памяти). И все они мчатся, пытаясь захватить блок синхронизации.

Вообразите целую группу людей, пытающихся выйти из переполненной комнаты через крошечную комнату. Да, вот так вот как работают потоки, когда пытаются получить блокировку синхронизации.

Но только один получает это и входит. Все остальные возвращаются ко сну, вроде как в то, что называется заблокированным состоянием. Это также дорого, с точки зрения ресурсов.

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

Вот что делает синхронизированные блоки дорогими. Теперь вот предостережение: раньше JDK 1.4 был очень дорогим. Это 17 лет назад. Java 1.4 начала видеть некоторые улучшения (2003 IIRC).

Затем в Java 1.5 были введены еще большие улучшения в 2005 году, 12 лет назад, благодаря которым синхронизированные блоки стали дешевле.

Важно помнить такие вещи. Там много устаревшей информации.

Что делать, если у меня есть огромное количество потоков, которые читают переменную volaile?

Это не имеет большого значения с точки зрения правильности. volatile Поле всегда будет отображать постоянное значение независимо от количества потоков.

Теперь, если у вас очень большое количество потоков, производительность может снизиться из-за переключений контекста, использования памяти и т. Д. (И не обязательно, и / или в первую очередь из-за доступа к volatile поле.

Можете ли вы дать определение конкуренции?

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

Вам понадобится более базовое введение в параллелизм, и в частности спор.

https://en.wikipedia.org/wiki/Resource_contention

С наилучшими пожеланиями.

Другие вопросы по тегам