Являются ли эти определения забора и выпуска забора неправильными?

В книге параллельного программирования Джо Даффи он определяет, как приобретать и отпускать ограждения следующим образом:

• Получить забор. Гарантирует, что после забора не будет груза или магазина, который придет после забора. Инструкции до того, как он все еще может двигаться после забора.

• Снять забор. Гарантирует, что не будет груза или хранилища, которое приходит до того, как забор переместится за забор. Инструкции после того, как это все еще может произойти перед забором.

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

1 ответ

Решение

Я постараюсь объяснить, что на основе Java volatile семантика. Вписывая некоторую ценность в volatile происходит переменная , прежде чем это значение может быть прочитано из этой переменной другим потоком (ами). Как это достигается? Давайте внимательнее посмотрим на некоторые инструкции:

  • Волатильное чтение, то есть чтение значения из volatile переменная;
  • Обычное чтение, то есть чтение значения из энергонезависимой переменной;
  • Летучая запись;
  • Нормальная запись;

Теперь модель памяти Java предоставляет вам некоторые гарантии поведения, одну из которых я написал выше. Вопрос - как это достигается?

Что ж, volatile Модификатор запрещает некоторые виды переупорядочений - энергозависимая запись не может быть помещена до нормальной записи, энергозависимая запись не может быть установлена ​​после обычного чтения

Как связать это с вашим вопросом? Я постараюсь сформулировать ответ на основе того, что я написал выше.

  • Существует несколько типов или переупорядочений, которые JVM и CPU могут выполнять с инструкциями, которые вы пишете в своей программе;
  • Барьеры памяти (заборы) запрещают некоторые из этих переупорядочений, в зависимости от типа забора; Говоря о ваших примерах, приобретение забора гарантирует, что все операции, которые будут происходить до забора, не произойдут после него; аналогично второму - все операции, которые должны происходить после забора, не будут перемещаться до забора; мои экзамены с volatile иллюстрирует это.
Другие вопросы по тегам