Предположим, что у меня есть статический сложный объект, который периодически обновляется пулом потоков и читается более или менее непрерывно в длинном потоке. Сам объект всегда неизменен и отражает самое последнее состояние чего-то.
class Foo() { int a, b; }
static Foo theFoo;
void updateFoo(int newA, int newB) {
f = new Foo();
f.a = newA;
f.b = newB;
// HERE
theFoo = f;
}
void readFoo() {
Foo f = theFoo;
// use f...
}
Мне все равно, читает ли мой читатель старый или новый Foo, однако мне нужно увидеть полностью инициализированный объект. IIUC. Спецификация Java говорит, что без барьера памяти в ЗДЕСЬ я могу увидеть объект с инициализацией f.b, но f.a еще не зафиксирован в памяти. Моя программа - это настоящая программа, которая рано или поздно переносит материал в память, поэтому мне не нужно сразу передавать новое значение theFoo в память (хотя это не помешает).
Как вы считаете, самый читаемый способ реализовать барьер памяти? Я готов заплатить небольшую цену за производительность, если потребуется. Я думаю, что я могу просто синхронизировать задание с Foo, и это сработает, но я не уверен, что это очень очевидно для тех, кто читает код, почему я это делаю. Я мог бы также синхронизировать всю инициализацию нового Foo, но это привело бы к большей блокировке, которая действительно необходима.
Как вы напишете его так, чтобы он был максимально читабельным?
Бонусные преимущества для версии Scala:)