Вы имеете ввиду this? По идее, во внешний мир это вернется после конструктора.
The most obvious reason it doesn't work it that the writes that initialize the Helper object and the write to the helper field can be done or perceived out of order. Thus, a thread which invokes getHelper() could see a non-null reference to a helper object, but see the default values for fields of the helper object, rather than the values set in the constructor.
Подумайте сами, как может конструктор отработать на половину?
Конечно с дуру можно и член сломать, но зачем Вам в конструкторе передавать указатель на себя еще куда-то?
По Вашему примеру рождается вопрос, не идет ли речь про Singleton? Если да, то 2 из 4 способов реализации этого паттерна описанные в книге Джошуа Блоха потокобезопасные.
Проблема в том, что большая часть из ответов старые и логика синхронный работы с тех пор менялась раз или два. Более того, среди более свежих заметок по этой теме мне уже встречались обе точки зрения - и я не могу понять, то ли те несколько заметок, которые говорят, что это безопасно, ошибочны, то ли ошибается большинство, которое по инерции считает, что инициализация потоково-небезопасна.
Суть volatile в том, что Вы говорите не кешировать это значение в процессоре, а всегда спускаться в память
Ну и нет, я не ошибался с адресатом - сообщение было предназначено именно вам.