EDIT
Basierend auf Ihrem bearbeiteten Titel BEGIN, scheint der Null-Koaleszenz-Operator selbst Thread-sicher (siehe Phil Haack's analysis) zu sein. Es scheint jedoch, dass es nicht gegen die möglichen mehrfache Aufrufe des StringBuilder-Konstruktors garantiert.
END EDIT
Sie haben ein größeres Problem mit einem Gewinde, und das ist, dass die Builder-Eigenschaft selbst Zustand darstellt, die über Threads gemeinsam genutzt werden können. Selbst wenn Sie den Thread für die verzögerte Initialisierung sicher machen, gibt es keine Garantie dafür, dass Methoden, die den Builder verwenden, threadsicher arbeiten.
// 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;
}
}
oben Das wird das Einfädeln Problem in der verzögerte Initialisierung von _builder, verhindern aber, wenn Sie Ihre Anrufe zu Instanzmethoden String synchronisieren, sind Sie nicht Thread-Sicherheit in allen Methoden garantiert, dass die Builder Eigenschaft verbrauchen. Dies liegt daran, dass Instanzmethoden in StringBuilder nicht threadsicher sind. Siehe den folgenden Text von MSDN StringBuilder page.
Alle öffentlichen static (Shared in Visual Basic) Member dieses Typs sind thread sicher. Alle Instanzmitglieder sind nicht garantiert Thread-sicher.
Wenn Sie StringBuilder in mehreren Threads verwenden, ist es wahrscheinlich besser, sie in Ihrer Klasse zu kapseln. Machen Builder private und belichten, welches Verhalten Sie sich als öffentliche Methode benötigen:
public void AppendString(string toAppend)
{
lock (Builder)
{
Builder.Append(toAppend);
}
}
Auf diese Weise Sie nicht Synchronisationscode der ganzen Ort zu schreiben.
Die C# -Spezifikation nennt sorgfältig, welche Operationen atomar sind; Null-Koaleszenzoperatoren sind nicht atomar. Der Koaleszenzoperator null ist nur ein syntaktischer Zucker für Ihren ersten Codeabschnitt. Aber Sie haben hier größere Probleme; Wen interessiert es, wenn das Feld threadsicher ist? Der Erbauer ist nicht threadsicher! –
Für zukünftige Fragen in diesem Sinne wäre es hilfreich, wenn Sie eine genau definierte Definition von genau was "Thread Safe" für Sie bedeutet. Fadensicherheit ist kein absolutes; Code ist threadsicher, wenn der von den Aufrufern implementierte Nutzungsvertrag mit dem vom Angerufenen erwarteten Vertrag kompatibel ist. Ohne zu wissen, welchen Vertrag Sie erwarten, ist es unmöglich zu sagen, ob der Code dem folgt oder nicht. –