Изучение некоторые ответы здесь о изменчивом поведении ключевых слов Я понял, что нацеливание на энергозависимые чтения архитектуры x86 всегда происходит из основной памяти, котораяЭто довольно дорого.
Рассмотрим следующую ситуацию: у меня есть блок кода, который выполняется, скажем, 3 потока.Примерно так:
class Foo {
private Bar bar;
public Bar read () {
return bar;
}
public void write(Bar bar) {
this.bar = bar;
}
}
А также я знаю, что чтение происходит из 3 разных потоков каждый небольшой промежуток времени (скажем, 100 мс), а запись происходит, скажем, раз в год.Чтобы придерживаться контекста, считайте Bar неизменным - этот вопрос не касается взаимодействия с этим объектом, речь идет только о самой ссылке.
Создание bar volatile будет выполнять свою задачу - каждое следующее чтение независимо от того, какой поток выполняет это чтение, закончитсяс правильными данными.Но это обходится очень дорого - каждое чтение будет считываться из основной памяти.
UPD : Поэтому мой вопрос следующий: можно ли на JVM избежать штрафачитать из основной памяти?Может быть, делая ссылку на энергонезависимые и сообщая потокам, что кэшированное значение может быть недопустимым, поэтому эти потоки читают из основной памяти только один раз в год, но не каждые 100 мс?Или, по крайней мере, сделать это дешевле, чем основной баран читать .Это также может быть сделано неблокирующим способом?Может быть, есть способ приблизиться к этому, используя случай-до ?