Часто задаваемые вопросы JSR-133:
Но синхронизация больше чем взаимное исключение. синхронизация гарантирует, что память записывается потоком до или во время синхронизированного блока становятся видимыми в предсказуемом образом к другим потокам, которые синхронизироваться на одном мониторе. После мы выходим из синхронизированного блока, мы отпустите монитор, который имеет эффект сброса кеша в основной памяти, так что записи, сделанные этим нить может быть видна другим потоки. Прежде чем мы сможем ввести синхронизированного блока, мы получаем монитора, что аннулирование кеша локального процессора так что переменные будут перезагружены из основной памяти. Тогда мы сможем видеть все сделанные записи по предыдущему выпуску.
Я также помню, как читал, что на современных Sun VM неуправляемые синхронизации дешевы. Я немного смущен этим утверждением. Рассмотрим код типа:
class Foo {
int x = 1;
int y = 1;
..
synchronized (aLock) {
x = x + 1;
}
}
Обновления x нуждаются в синхронизации, но получает ли блокировка значение y также из кеша? Я не могу представить, чтобы это было так, потому что, если бы это было так, методы, такие как блокировка полосы, могут не помочь. В качестве альтернативы, JVM надежно анализирует код, чтобы гарантировать, что y не изменяется в другом синхронизированном блоке с использованием той же блокировки и, следовательно, не выгружает значение y в кеше при входе в синхронизированный блок?