JSR-133 FAQ говорит:эффекты памяти синхронизации в Java
Но есть больше синхронизации чем взаимное исключение. Синхронизация гарантирует, что запись в памяти по потоку до или во время синхронизированного блока отображаются в предсказуемом способом другим потокам, которые синхронизируются на одном мониторе. После мы выходим синхронизированный блок, мы выпустить монитор, который имеет эффект очистки кэша для основного памяти, так что пишет из этого нити может быть видны другими потоков. Прежде чем мы сможем ввести синхронизируемый блок , мы получим монитор , который имеет значение , недействительный локальный кеш процессора , так что переменные будут перезагружены из основной памяти. Затем мы сможем сделать , чтобы просмотреть все сделанные записи по предыдущей версии.
Я также помню, что читал, что на современных ВС виртуальные синхронизаторы дешевы. Я немного смущен этим утверждением. Рассмотрим такой код:
class Foo {
int x = 1;
int y = 1;
..
synchronized (aLock) {
x = x + 1;
}
}
обновления для х нужна синхронизация, но приобретение замка очистить значение у также из кэша? Я не могу представить, чтобы это было так, потому что, если бы это было так, методы, такие как блокировка полосы, могут не помочь. В качестве альтернативы, JVM надежно анализирует код, чтобы гарантировать, что y не изменяется в другом синхронизированном блоке с использованием той же блокировки и, следовательно, не выгружает значение y в кеше при входе в синхронизированный блок?
Недавно я натолкнулся на статью [CPU Cache Flushing Fallacy] (http://mechanical-sympathy.blogspot.com/2013/02/cpu-cache-flushing-fallacy.html), что было полезно для понимания этого лучше. –