Читаю "The Art of Multiprocessor Programming" (т.к. заинтересовало описание книги в https://eax.me/books-issue-15/), и испытваю некоторые трудности с примерами.
Авторы книги время от времени показывают сниппеты кода на Java, называя их потокобезопасными, но часто я не понимаю, почему же показанный код является таковым.
Например, на странице 78 (99 в PDF) есть следующая структурка:
public class SafeBooleanMRSWRegister implements Register<Boolean> {
boolean[] s_table; // array of safe SRSW registers
public SafeBooleanMRSWRegister(int capacity) {
s_table = new boolean[capacity];
}
public Boolean read() {
return s_table[ThreadID.get()];
}
public void write(Boolean x) {
for (int i = 0; i < s_table.length; i++)
s_table[i] = x;
}
}
"MRSW" в имени класса расшифровываются как Multiple Readers Single Writer, т.е. класс поддерживает запись (вызов write) из одного потока, и чтение (вызов read) из нескольких.
Safe в имени класса говрит о следующем (страница 74 (95 в PDF)):
A single-writer, multi-reader register implementation is safe if — A read() call that does not overlap a write() call returns the value written by the most recentwrite() call.
Т.е. если не вызывать read одновремнно с write, то read всегда будет возвращать последнее значение, переданное во write.
Но я не понимаю, почему - в классе нет никакой синхронизации, нет использования volatile и других вещей, которые заставили бы потоки инвалидировать свой кеш перед вызовом read(). Т.е. кажется, что значения, переданные во write(), совсем не гарантируются к прочтению из read().
Что я понимаю не так?