Тема барьеров памяти довольно сложна. Это даже время от времени сбивает с толку экспертов. Когда мы говорим о барьере памяти, мы действительно объединяем две разные идеи.
- Получить забор: барьер памяти, в котором другим читателям и записчикам не разрешено перемещаться до забор.
- Снять забор: барьер памяти, в котором другим читателям и записчикам запрещается перемещаться после забор.
Барьер памяти, который создает только один из двух, иногда называют полусбором . Барьер памяти, который создает оба, иногда называют full-fence .
Ключевое слово volatile
создает половину заборов. Чтения изменчивых полей имеют семантику получения, в то время как записи имеют семантику выпуска. Это означает, что ни одна инструкция не может быть перемещена перед чтением или после записи.
Ключевое слово lock
создает полные заборы на обеих границах (вход и выход). Это означает, что ни одна инструкция не может быть перемещена ни до, ни после каждой границы.
Тем не менее, все это тоо, если мы имеем дело только с одним потоком. Упорядочение, как оно воспринимается этой веткой, всегда сохраняется. На самом деле, без такой фундаментальной гарантии ни одна программа не будет работать правильно. Реальная проблема заключается в том, как другие потоки воспринимают чтение и запись. Вот где вы должны быть обеспокоены.
Итак, чтобы ответить на ваши вопросы:
С точки зрения одного потока ... да. С точки зрения другого потока ... нет.
Это зависит. Это может сработать, но мне нужно лучше понять, что вы пытаетесь достичь.
С точки зрения другого потока ... нет. Чтение и запись могут свободно перемещаться в пределах границ замка. Они просто не могут выйти за эти границы. Вот почему важно, чтобы другие потоки также создавали барьеры памяти.