En fait, l'exemple donné peut être être de type sécurisé. De plus, cela pourrait même être une bonne idée. Si plusieurs threads atteignent la valeur null avant que le premier thread ne soit écrit dans _instance (et même après que le premier thread ait été écrit dans _instance, mais avant que le CPU du second thread n'ait chargé la nouvelle valeur dans son cache), alors le deuxième (et troisième, et quatrième ...) thread créera une nouvelle instance et écrira ceci à _instance.
Dans un langage récupéré, cela signifie simplement que pendant un bref instant plusieurs threads auront leur propre version de _instance, mais bientôt ils sortiront de la portée et seront éligibles pour la récupération de place.
Maintenant, c'est un gaspillage, mais que ce soit réellement un problème ou non dépend de la coûteuse création d'une nouvelle instance et de l'existence de conséquences négatives s'il en existe plusieurs. Très souvent, l'inconvénient d'une telle duplication inutile des objets d'instance est assez faible, auquel cas il peut être moins négatif que le coût du verrouillage (le verrouillage est relativement bon marché mais pas gratuit, l'attente d'un verrou peut être assez coûteuse, et certains cas [impasse étant le cas le plus extrême] coûtant extrêmement cher), ou même de CASsing. Même si c'est plus cher, cela peut ne pas être dangereux.
Puisque nous ne pouvons pas juger si c'est le cas dans l'exemple ci-dessus, nous ne savons pas si c'est thread-safe ou non. Cependant, créer sur une construction statique est probablement la meilleure façon de procéder.
Langue? L'explication sera similaire, mais pas la même, entre Java et .NET. –