Влияет ли неправильно созданный объект только на видимость потока, который он публикует внутри конструктора tbe?

Когда http://www.cs.umd.edu/~pugh/java/memoryModel/jsr-133-faq.html говорит

Значения для конечных полей объекта задаются в его конструкторе. Предполагая, что объект построен "правильно", после создания объекта значения, присвоенные последним полям в конструкторе, будут видны всем другим потокам без синхронизации. Кроме того, видимые значения для любого другого объекта или массива, на которые ссылаются эти последние поля, будут по крайней мере такими же актуальными, как и последние поля. Что означает, что объект должен быть правильно построен? Это просто означает, что никакая ссылка на конструируемый объект не может "убежать" во время строительства.

Означает ли это, что только поток, который видел неправильно сконструированный объект, может видеть его в плохом состоянии, но все остальные потоки в порядке?

Например, скажем, у вас есть простой код

public class Foo {
  final int x = 5;
  public Foo() {
      new Thread(() -> System.out.print(x)).start();
  }
}

Означает ли это, что только тот поток, который видел неявный this ссылка может иметь проблемы с видимостью, но любые другие потоки, которые используют экземпляр Foo, гарантированно увидят отлично видимую ссылку Foo и ее поле x быть 5?

1 ответ

Решение

JLS заявляет,

Объект считается полностью инициализированным после завершения его конструктора. Поток, который может видеть ссылку на объект только после того, как этот объект был полностью инициализирован, гарантированно увидит правильно инициализированные значения для этого объекта. final поля.

Нет никаких указаний на то, что небезопасная публикация по отношению к другому потоку будет влиять на гарантию видимости одного потока.

Другие вопросы по тегам