BEGIN EDIT
Basé sur le titre édité, l'opérateur nul-coalescent lui-même semble être thread-safe (voir Phil Haack's analysis). Il semble, cependant, qu'il ne garantit pas contre les appels multiples potentiels au constructeur StringBuilder.
FIN EDIT
Vous avez un problème plus important avec filetage, et qui est que la propriété Builder lui-même représente l'état qui peut être partagé entre les threads. Même si vous sécurisez le thread d'initialisation paresseux, il n'y a aucune garantie que les méthodes consommant Builder le font d'une manière sûre pour les threads.
// below code makes the getter thread safe
private object builderConstructionSynch = new object();
public StringBuilder Builder
{
get
{
lock (builderConstructionSynch)
{
if (_builder == null) _builder = new StringBuilder();
}
return _builder;
}
}
La volonté ci-dessus éviter le problème de thread dans l'initialisation paresseuse de _builder, mais à moins que vous synchronisez vos appels à des méthodes d'instance de StringBuilder, vous n'êtes pas garanti la sécurité de fil dans toutes les méthodes qui consomment la propriété Builder. C'est parce que les méthodes d'instance dans StringBuilder n'ont pas été conçues pour être thread-safe. Voir le texte ci-dessous du MSDN StringBuilder page.
statiques publics (en Visual Basic) de ce type sont thread sûr. Tous les membres d'instance ne sont pas garanti être thread-safe.
Si vous consommez StringBuilder dans plusieurs threads, il est probablement préférable de l'encapsuler dans votre classe. Rendre privé et d'exposer Builder ce que le comportement dont vous avez besoin en tant que méthode publique:
public void AppendString(string toAppend)
{
lock (Builder)
{
Builder.Append(toAppend);
}
}
De cette façon, vous n'êtes pas à écrire du code de synchronisation dans tous les sens.
La spécification C# appelle soigneusement quelles opérations sont atomiques; Les opérateurs de coalescence nuls ne sont pas atomiques. L'opérateur de coalescence null est juste un sucre syntaxique pour votre premier morceau de code. Mais vous avez des problèmes plus importants ici; qui se soucie si le champ est threadsafe? Le constructeur n'est pas threadsafe! –
Pour des questions futures dans ce sens, il serait utile que vous fournissiez une définition soigneusement formulée de ce que signifie exactement "thread safe". La sécurité du fil n'est pas un absolu; au contraire, le code est thread-safe si le contrat d'utilisation implémenté par les appelants est compatible avec celui attendu par l'appelé. Sans savoir quel contrat vous attendez, il est impossible de dire si le code le suit ou non. –