Блокирует ли volatile когда-либо переключение контекста? - PullRequest
5 голосов
/ 27 февраля 2012

Первоначально я думал, что переменная переменная лучше, чем синхронизированное ключевое слово, поскольку она не включает БЛОКИРОВКУ или КОНТЕКСТНОЕ ПЕРЕКЛЮЧЕНИЕ. Но читая это я сейчас растерялся.

Реализуется ли энергозависимый неблокирующий подход с использованием низкоуровневых атомных блокировок или нет?

Ответы [ 5 ]

5 голосов
/ 27 февраля 2012

Реализуется ли volatile в неблокирующем подходе с использованием низкоуровневых атомных блокировок или нет?

Реализация Volatile варьируется в зависимости от процессора, но это неблокирующая загрузка / хранение в поле -он обычно реализуется через ограждения памяти, но может также управляться с помощью когерентных протоколов.

Я только что прочитал этот пост.Этот плакат на самом деле неверен в его объяснениях Volatile vs Synchronized flow, и кто-то исправил его как комментарий.Volatile не будет удерживать блокировку, вы можете прочитать, что энергозависимое хранилище похоже на синхронизированный выпуск, а энергозависимая загрузка похожа на синхронизированное получение, но это относится только к видимости памяти, а не к фактическим деталям реализации

5 голосов
/ 27 февраля 2012

Реализуется ли энергозависимый неблокирующий подход с использованием низкоуровневых атомных блокировок или нет?

Использование volatile устанавливает барьер памяти вокруг рассматриваемого поля. Это не приводит к переводу потока в состояние "BLOCKING". Однако при доступе к полю volatile программа должна сбрасывать изменения в центральную память и обновлять кеш-память, что занимает циклы. Это может привести к переключению контекста, но не обязательно вызвать один.

3 голосов
/ 27 февраля 2012

Это правда, что volatile не вызывает блокировку.

Тем не менее, оператор

переменная переменная была лучше, чем синхронизированное ключевое слово, так как она не включала BLOCKING или CONTEXT SWITCHING.

очень спорно и в значительной степени зависит от того, что вы пытаетесь сделать.volatile не эквивалентен блокировке, и объявление переменной volatile не дает никаких гарантий относительно атомарности операций, в которые входит эта переменная, например, приращение.

Что volatile делает, это предотвращает компилятор и /или ЦП выполняет переупорядочение команд или кэширование конкретной переменной.Это известно как забор памяти.Этот неприятный небольшой механизм необходим для обеспечения того, чтобы в многопоточной среде все потоки, читающие определенную переменную, имели актуальное представление о ее значении.Это называется видимость и отличается от атомарность .

Атомность может быть гарантирована только в общем случае с помощью замков (synchronized) или атомарных примитивов.

Что может сбить с толку, так это тот факт, что использование механизмов синхронизации также генерирует неявное ограничение памяти, поэтому объявление переменной volatile, если вы собираетесь только читать / записывать ее внутри synchronized блоков,избыточный.

1 голос
/ 27 февраля 2012

Volatile является модификатором языка Java, и то, как он предоставляет свои гарантии, сводится к реализации JVM.Проще говоря, если вы установите примитивное поле как volatile, вы гарантируете, что какой-либо поток читает это поле, он будет читать самое последнее значение.По сути, он запрещает любую JVM за кулисами оптимизации и заставляет все потоки пересекать барьер памяти для чтения изменчивого примитива.

0 голосов
/ 28 мая 2015

BLOCKING означает, что потоки не ждут друг друга при чтении одной и той же переменной volatile, делая это без взаимного исключения.Однако они инициируют установку ограждений на аппаратном уровне для наблюдения семантики «происходит до» (без переупорядочения памяти).

Чтобы сделать это более понятным, переменная volatile не блокируется, потому что всякий раз, когда она читается /одновременно несколькими потоками ядра ЦП, связанные с их потоками, обмениваются данными непосредственно с основной памятью или через кэш-когерентность ЦП (зависит от реализации оборудования / JVM), и механизм блокировки не устанавливается.

ПЕРЕКЛЮЧЕНИЕ КОНТЕКСТА Ключевое слово volatile не запускает переключение контекста самостоятельно из своей семантики, но возможно и зависит от реализаций более низкого уровня.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...