If you have atomic swaps (hardware "lock-free"), the global shared instance pointer should be enough - since it either holds a valid pointer or it doesn't.
I.e. reads could otherwise get re-ordered so that you see the pointer and the not-yet-initialized object at the same time.