Как Java java.util.concurrent.locks.Lock гарантирует синхронизацию памяти между потоками?

1

Проверьте этот фрагмент кода Java:

 Lock l = ReentrantLock();
 l.lock();
 try {
     counter++;
 } finally {
     l.unlock();
 }

Этот код гарантирует, что только один поток выполнит код в блоке try в определенное время.

Мой вопрос: как механизм блокировки/разблокировки гарантирует видимость памяти между потоками? (каков механизм, который позволит убедиться, что результат счетчика будет сброшен в основную память потоком X и будет загружен из основной памяти потоком Y, который появится после?)

Теги:
multithreading
concurrency
jvm
synchronization

1 ответ

1

http://docs.oracle.com/javase/specs/jls/se7/html/jls-17.html#jls-17.4.5

17.4.5. Бывает-до заказа

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

...

Из приведенных выше определений следует, что:

Разблокировка на мониторе происходит до каждой последующей блокировки на этом мониторе.

...

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

Видение подразумевается видеть из другой нити.

  • 0
    Спасибо за ссылку, он объясняет, что между разблокировкой и следующей блокировкой существует отношение «до» (что является разумным), но все равно не объясняет, почему данные между исходной блокировкой для разблокировки синхронизируются с следующей. нить..
  • 0
    Причина, по которой поток B может видеть значение, отличное от потока A, заключается в переупорядочении команд, помимо прочего. На этой странице объясняется, почему отношение Happens-Before обеспечивает согласованность памяти: docs.oracle.com/javase/tutorial/essential/concurrency/…

Ещё вопросы

Сообщество Overcoder
Наверх
Меню