Ответ 1
Потому что это окончательно, да. Конечные переменные имеют специальную семантику с точки зрения безопасности, в то время как другие потоки гарантированно будут видеть конечное поле, по крайней мере, в том состоянии, в котором он находился, когда закончил конструктор.
Это JLS 17.5, хотя язык там немного плотный. Эти семантики были введены в Java 1.5, в частности, JSR-133. См. Эту страницу для неспецифического обсуждения JSR-133 и его различных последствий.
Обратите внимание, что если вы измените экземпляр после его конструктора, это не обязательно безопасно для потоков. В этом случае вы должны принять обычные меры предосторожности в отношении потока, чтобы убедиться в этом, - перед краями.
Я уверен (хотя и не совсем 100%), что тот факт, что только один поток выполняет инициализацию класса, не является фактором здесь. Верно, что класс инициализируется только одним потоком, но я не думаю, что есть какие-то конкретные события - до того, как ребра, установленные между этим потоком, будут любыми другими потоками, которые используют этот класс (кроме этого другого потока, не требующего повторной инициализации класс). Таким образом, без ключевого слова final
другой поток сможет увидеть частично сконструированный экземпляр объекта. Специфическое происходит до того, как ребра, определенные JMM, находятся в JLS 17.4.5, и инициализация класса там не указана.