BEGIN EDIT
Sulla base della sua titolo modificato, l'operatore null coalescenza stessa sembra essere thread-safe (vedi Phil Haack's analysis). Sembra, tuttavia, che non garantisce contro le potenziali chiamate multiple al costruttore StringBuilder.
FINE EDIT
Hai un problema più grande con filettatura, e cioè che la proprietà del costruttore stesso rappresenta stato che può essere condiviso tra i thread. Anche se si rende sicuro il thread di inizializzazione pigro, non è possibile garantire che i metodi che utilizzano Builder lo facciano in modalità thread-safe.
// 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;
}
}
È possibile che questo impedirà il problema filettatura nella inizializzazione differita di _builder, ma a meno che non si sincronizzano le chiamate ai metodi di StringBuilder esempio, non la garanzia di sicurezza filo in qualsiasi metodo che consumano la proprietà Builder. Questo perché i metodi di istanza in StringBuilder non sono stati progettati per essere thread-safe. Vedere il testo seguente da MSDN StringBuilder page.
statici pubblici (Shared in Visual Basic) di questo tipo sono thread sicuri. Qualsiasi membro di istanza non è garantito come thread-safe.
Se stai consumando StringBuilder in più thread, è probabile che tu lo stia meglio incapsulando nella tua classe. Fare Builder privato ed esporre ciò che il comportamento è necessario come un metodo pubblico:
public void AppendString(string toAppend)
{
lock (Builder)
{
Builder.Append(toAppend);
}
}
In questo modo non sta scrivendo codice di sincronizzazione in tutto il luogo.
fonte
2009-06-03 13:19:29
La specifica C# indica con attenzione quali operazioni sono atomiche; gli operatori a coalescenza nulla non sono atomici. L'operatore null coalescente è solo uno zucchero sintattico per il tuo primo pezzo di codice. Ma tu hai problemi più grandi qui; a chi importa se il campo è sicuro? Il costruttore non è protetto da bug! –
Per le domande future in questo senso, sarebbe di grande aiuto se fornissi una definizione formulata con cura esattamente di cosa significa "thread safe" per te. La sicurezza del filo non è assoluta; piuttosto, il codice è thread-safe se il contratto d'uso implementato dai chiamanti è compatibile con quello atteso dal destinatario. Senza sapere quale contratto ti aspetti, è impossibile dire se il codice lo segue o meno. –