В классической книге «Параллелизм в Java на практике» Брайан Гетц использует следующий фрагмент кода, чтобы продемонстрировать, как безопасно опубликовать объект с помощью закрытого конструктора и фабричного метода:
public class SafeListener {
private final EventListener listener;
private SafeListener() {
listener = new EventListener() {
public void onEvent(Event e) {
doSomething(e);
}
};
}
public static SafeListener newInstance(EventSource source) {
SafeListener safe = new SafeListener();
source.registerListener(safe.listener);
return safe;
}
}
Чего я пока не могу понять, так это того, как этот код обеспечивает безопасную публикацию через частный конструктор.
Мне известно, что закрытый конструктор используется для предотвращения создания экземпляров вне объекта, но как это относится к потоку, а не к объекту? Поток не обязательно является объектом, и я не понимаю, что не позволяет другому потоку получить ссылку на safe
до того, как конструктор завершит выполнение.