Подумайте сами, как может конструктор отработать на половину? Он же вернет ссылку на результат своей работы вызываемому коду когда исполнится весь. Конечно с дуру можно и член сломать, но зачем Вам в конструкторе передавать указатель на себя еще куда-то?
По Вашему примеру рождается вопрос, не идет ли речь про Singleton? Если да, то 2 из 4 способов реализации этого паттерна описанные в книге Джошуа Блоха потокобезопасные.
P.S. Суть volatile в том, что Вы говорите не кешировать это значение в процессоре, а всегда спускаться в память (кстати, тут я не знаю, если в системе один процессор Intel, у них в отличии от AMD кеш третьего уровня общий, будет ли использован он или все равно только память), чтобы работать со свежим значением. Без этого два ядра могут долго работать со своими значениями, но вот атомарность записи этого значения не гарантируется. То есть, например int будет атомарно меняться, а вот long уже нет. Поэтому, на счет ссылок не уверен, они вроде бы тоже 64 бита, по идее, они тоже должны быть не атомарны, но может там другая защита, а то создадим два объекта и получим ссылку непонятно куда.