Я читаю B. Goetz Java Concurrency На практике, и теперь я в section 3.5
о безопасной публикации. Он заявил:
// Unsafe publication
public Holder holder;
public void initialize() {
holder = new Holder(42);
}
Эта ненадлежащая публикация может позволить другому потоку наблюдать частично построенный объект.
Я не понимаю, почему можно наблюдать частично построенный подобъект. Предположим, что конструктор Holder(int)
не позволяет this
уйти. Таким образом, построенная ссылка может наблюдаться только вызывающим. Теперь, как JLS 17.7, говорится:
Писания и чтения ссылок всегда являются атомарными, независимо от того, независимо от того, реализованы ли они как 32-битные или 64-битные значения.
невозможно, чтобы поток наблюдал частично сконструированный объект.
Где я был неправ?