Java Concurrency на практике гласит следующее:
Когда поток A выполняет синхронизированный блок, а затем поток B входит в синхронизированный блок, защищенный той же блокировкой, значения переменных, которые были видимы дляA до снятия блокировки гарантированно будут видны B при получении блокировки.Другими словами, все, что A * в или до синхронизировало блок, видимо B, когда он выполняет синхронизированный блок, защищенный той же блокировкой.Без синхронизации такой гарантии нет.
![Here's a diagram from the book](https://i.stack.imgur.com/cQ8nb.png)
Та же логика применима к переменным переменным:
Эффекты видимости изменчивых переменныхвыходить за пределы значения самой изменчивой переменной.Когда поток A выполняет запись в переменную volatile, а затем поток B читает эту же переменную, значения всех переменных, которые были видны A до записи в переменную volatile, становятся видимыми для B после чтения переменной volatile.
Из описания очень ясно, что вы можете использовать этот эффект видимости для фактической замены (или ограничения использования) традиционных блокировок, когда вам нужно получить доступ к некоторому общему состоянию.В примере из диаграммы вы можете видеть, что поток B может безопасно прочитать переменную y
, даже если она была изменена в потоке A вне синхронизированного блока.
Итак, безопасно ли использовать это visibility guarantee
когда вы изменяете какое-то общее состояние перед тем, как заблокировать поток, затем берете блокировку, делаете что-то (или ничего, я полагаю), снимаете блокировку, а затем в другом потоке вы получаете такую же блокировку, снимаете ее и затем безопасно читаетепоследние значения из общих переменных, которые были обновлены в первом потоке?