Проверьте этот фрагмент кода Java:
Lock l = ReentrantLock();
l.lock();
try {
counter++;
} finally {
l.unlock();
}
Этот код гарантирует, что только один поток выполнит код в блоке try в определенное время.
Мой вопрос: как механизм блокировки/разблокировки гарантирует видимость памяти между потоками? (каков механизм, который позволит убедиться, что результат счетчика будет сброшен в основную память потоком X и будет загружен из основной памяти потоком Y, который появится после?)
http://docs.oracle.com/javase/specs/jls/se7/html/jls-17.html#jls-17.4.5
17.4.5. Бывает-до заказа
Два действия могут быть упорядочены с помощью отношения, которое происходит до этого. Если происходит одно действие - перед другим, то первое видно и упорядочивается до второго.
...
Из приведенных выше определений следует, что:
Разблокировка на мониторе происходит до каждой последующей блокировки на этом мониторе.
...
В случае, когда происходит последовательный набор действий, каждый прочитанный видит запись, которую разрешено видеть путем упорядочивания.
Видение подразумевается видеть из другой нити.