Est .NET StringBuilder thread-safe
La régulière "Filet de Sécurité" de la section de la documentation MSDN pour StringBuilder
stipule que:
...tout les membres de l'instance ne sont pas garantis pour être thread-safe...
mais cette déclaration se sent comme il a été copié et collé pour presque toutes les classes dans le Cadre de:
http://msdn.microsoft.com/en-us/library/system.text.stringbuilder.aspx
Cependant, ces billets de blog par Gavin Pugh mention "thread-safe" comportements de StringBuilder
:
http://www.gavpugh.com/2010/03/23/xnac-stringbuilder-to-string-with-no-garbage/
http://www.gavpugh.com/2010/04/01/xnac-avoiding-garbage-when-working-with-stringbuilder/
En outre, la source de StringBuilder révélé par le Réflecteur, et l'accompagnement des commentaires
dans le SSCLI source, suggèrent également de nombreuses considérations de mise en œuvre pour assurer fil-sécurité:
Quelqu'un a une meilleure idée de savoir si un StringBuilder
instance est sécuritaire de le partager entre plusieurs threads simultanés?
Vous devez vous connecter pour publier un commentaire.
Absolument pas; voici un exemple simple levée de 4.0 via réflecteur:
L'attribut simplement gère les appelants, pas thread-la sécurité, c'est absolument pas thread-safe.
Mise à jour: à la recherche à la source, il les références, ce n'est clairement pas le courant .NET 4.0 base de code (comparaison de quelques méthodes). Peut-être qu'il parle d'un particulier .Version NET, ou peut-être XNA, mais il est pas le cas en général. Le 4.0
StringBuilder
ne pas ont unm_currentThread
champ, qui Gavin source d'utilisations; il y a un indice (une partie inutilisée de la constanteThreadIDField
) qu'il utilisé d'exister, mais... ne sont plus.Si vous voulez un direct de réfutation - exécuter sur 4.0; il sera plus susceptible de donner la bonne longueur (j'ai vu un peu dans la 4k région, un peu dans le 2k région - cela devrait être exactement 5000), mais certains autres
Append
méthodes (Append(char)
par exemple) ont tendance à plus susceptible de lancer des exceptions, selon calendrier:String.Builder
jusqu'à 3,5 contient toujours le fil code de vérification. Voir stackoverflow.com/a/3564934/3205 pour plus de détails.Le point de l'ensemble de la documentation est de vous donner des garanties. Dans ce cas, les membres de l'instance, rien n'est garanti d'être thread-safe et vous devez le traiter comme tel, donc en s'appuyant sur les méthodes de synchronisation externe.
Que certaines choses peut être thread-safe est un détail de l'implémentation qui peut et peut-être fait changer d'une version de la structure à l'autre ou d'une mise en œuvre à l'autre (en fait, il ya beaucoup de ce genre de détails évolution dans le cadre de versions; Eric Lippert a certains postes, en détaillant un peu). Ne comptez pas sur elle.
(En d'autres termes: Ne pas écrire du code pour une mise en œuvre, de l'écrire contre l'interface et le contrat qui les métadonnées de la classe et de sa documentation dans ce cas.)
De la La documentation MSDN: