Oui et ?
Le bug que tu rencontre sans protéger tes singletons c'est pas simplement d'avoir deux valeurs sur deux threads différents…
Si le thread 1 initialise le singleton pendant que le thread 2 lit le null, puis que le thread 2 stocke le singleton juste après que le thread 1 ait retourné le singleton, le thread 1 a son singleton a lui, et la fois suivante (qui peut être « juste après ») il récupèrera (très probablement) le singleton créé par le thread 2. Donc le thread 1 a deux valeurs différentes l'une à la suite de l'autre.
Certes, Brunni n'a pas précisé si y'a un autre thread qui bidouille derrière, mais c'est le bug « courant », et ça semble l'explication la plus logique à ce problème sans plus de précision…
Quoi qu'il en soit, le mieux à utiliser reste le singleton « naturel » de C#, qui ne foire « jamais » ^^ (Et ne nécessite qu'une ligne de code

)