Когда я прочитал jsr-133-faq на вопрос «Как работают последние поля в новом JMM?», Он сказал:
class FinalFieldExample {
final int x;
int y;
static FinalFieldExample f;
public FinalFieldExample() {
x = 3;
y = 4;
}
static void writer() {
f = new FinalFieldExample();
}
static void reader() {
if (f != null) {
int i = f.x;
int j = f.y;
}
}
}
КлассВыше приведен пример того, как должны использоваться последние поля.Читатель, выполняющий поток, гарантированно увидит значение 3 для fx, потому что оно является окончательным.Не гарантируется увидеть значение 4 для y, потому что оно не является окончательным.
Это сбивает меня с толку, поскольку код в средстве записи не является безопасной публикацией, читатель, выполняющий поток, может увидеть, что f неnull, но конструктор объекта, на который ссылается f, еще не завершен, поэтому, даже если x является окончательным, поток, выполняющий читатель, не может быть уверен, что увидит значение 3 для fx
Это место, где яЯ в замешательстве, пожалуйста, поправьте меня, если я ошибаюсь, большое спасибо.