Сначала объект должен быть действительно неизменным - не только открытый интерфейс, но и все внутреннее состояние должно быть инициализировано. Это запрещает, например, "получить один раз, а затем кэш" или отложенной инициализации.
Во-вторых, во время построения объекты модифицируются - и из-за оптимизации и переупорядочения команд в CPU порядок записи памяти не обязательно совпадает с порядком, который вы видите в исходном коде.
Это означает, что без синхронизации другой поток может уже видеть действительную ссылку на объект, прежде чем он будет полностью создан.
Я недостаточно знаком с моделью mem C #, чтобы точно сказать, какая синхронизация необходима - может быть, кто-то еще может помочь (сделал сообщество вики)