Недавно я запутался, когда я упомянул JMM о гарантиях, связанных с «окончательным». Вот выдержка и пример из JMMМодель памяти Java и конечные поля
На рисунке 4 приведен пример, показывающий, как конечные поля сравниваются с нормальными полями. Класс FinalFieldExample имеет конечное внутреннее поле x и неединичное int y. Один поток может выполнить метод writer(), а другой может выполнить метод reader(). Поскольку writer() записывает f после завершения работы конструктора объекта, читателю() будет гарантировано видеть правильно инициализированное значение для f.x: он будет читать значение 3. Однако f.y не является окончательным; метод для чтения(), следовательно, не гарантируется, чтобы увидеть значение 4 для него
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; // guaranteed to see 3
int j = f.y; // could see 0
}
}
}
Моей путаница в том, что является объектом «Obj» имеет конечные и неконечные поля полностью инициализирован и в настоящее время ссылаются на волоске 'T', T будет видеть только правильные значения для окончательных полей? Что относительно нефинальных полей, которые не изменяются после строительства. Я понимаю, что если они мутируются после того, как строительная нить «T» может не увидеть новое значение (если поле не изменчиво). Но я уверен, что если поле не является окончательным и не летучим и не будет изменено после строительства?
Как JVM реализует гарантии, связанные с «final»? Например, для летучих существуют барьеры памяти.
Ответьте здесь: http://stackoverflow.com/questions/10301061/is-this-a-safe-publication-of-object/10301179#10301179 – Gray
есть ошибка в этом коде - после того, как 'if (f! = Null)' check, 'f' может появиться снова null. код должен использовать локальную переменную для кэширования 'f' – ZhongYu
http://stackoverflow.com/a/15342485/2031799 - вот как реализуются окончательные поля. Теоретически этот пример может сломаться, но не на практике. – Mikhail