En realidad, el ejemplo dado podría ser seguro. Además, incluso podría ser una idea razonablemente buena.
Si varios hilos alcanzan la comprobación nula antes de que el primer hilo haya escrito en _instance (y de hecho, quizás después de que el primer hilo haya escrito en _instance, pero antes de que la CPU del segundo hilo haya cargado el nuevo valor en su caché), luego, el segundo (y tercer, y cuarto ...) subproceso creará una nueva instancia y escribirá esto en _instance.
En un lenguaje recogido de basura, esto solo significa que, por un breve período, varios subprocesos tendrán su propia versión de _instance, pero muy pronto se saldrán del alcance y serán elegibles para la recolección de basura.
Ahora, esto es un desperdicio, pero si realmente es un problema o no depende de qué tan caro es crear una nueva instancia y si hay consecuencias negativas en tener más de una existencia. Muy a menudo la desventaja de tal duplicación innecesaria de objetos de instancia es bastante leve, en cuyo caso podría ser menos negativa que el costo de bloqueo (el bloqueo es relativamente barato pero no gratuito, esperar un bloqueo puede ser bastante caro, y en algunos casos [el punto muerto es el caso más extremo] invaluablemente caro), o incluso de CASsing. Incluso si es más costoso, todavía no puede ser inseguro.
Dado que no podemos juzgar si este es el caso en el ejemplo anterior, en realidad no sabemos si es seguro para subprocesos o no.
Lo más probable es que crear en una construcción estática sea el camino a seguir.
Idioma? La explicación será similar, pero no es lo mismo, entre Java y .NET. –