Jeder weiß, dass dies nicht Thread-sicher ist:
%Vor%Was ist damit?
%Vor%BEGIN EDIT
Basierend auf Ihrem bearbeiteten Titel scheint der Nullkoaleszenz-Operator selbst Thread-sicher zu sein (siehe Phil Haacks Analyse ). Es scheint jedoch, dass es nicht gegen die möglichen Mehrfachaufrufe des StringBuilder-Konstruktors garantiert.
ENDE BEARBEITEN
Sie haben ein größeres Problem mit Threading, und das bedeutet, dass die Builder-Eigenschaft selbst einen Status darstellt, der über Threads hinweg geteilt werden kann. Selbst wenn Sie den trägen Initialisierungs-Thread sicher machen, gibt es keine Garantie dafür, dass Methoden, die den Builder verwenden, dies threadsicher tun.
%Vor%Das obige verhindert das Threading-Problem bei der verzögerten Initialisierung von _builder. Wenn Sie jedoch Ihre Aufrufe für Instanzmethoden von StringBuilder nicht synchronisieren, ist die Threadsicherheit in Methoden, die die Builder-Eigenschaft verwenden, nicht garantiert. Dies liegt daran, dass Instanzmethoden in StringBuilder nicht threadsicher sind. Lesen Sie den folgenden Text auf der MSDN StringBuilder-Seite .
Jede öffentliche statische (freigegeben in Visual Basic) Mitglieder dieses Typs sind Thread sicher. Alle Instanzmitglieder sind es nicht garantiert fadensicher.
Wenn Sie StringBuilder in mehreren Threads verwenden, ist es wahrscheinlich besser, sie in Ihrer Klasse zu kapseln. Machen Sie Builder privat und legen Sie dar, welches Verhalten Sie als öffentliche Methode benötigen:
%Vor%Auf diese Weise schreiben Sie nicht überall Synchronisationscode.
Das ist nicht mehr oder weniger Thread-sicher; Du könntest immer noch zwei Threads haben, die den Null-Check gleichzeitig durchführen, also separate Objekte erstellen und die anderen nicht sehen.
Die angegebenen Antworten sind korrekt, beide sind nicht threadsicher. Tatsächlich sind sie meistens gleichwertig und der Operator ??
ist nur Compiler-Magie, um den Code schlanker zu machen. Sie müssen einen Synchronisationsmechanismus verwenden, wenn Sie möchten, dass dies threadsicher wird.
Ich habe diesen Ansatz nicht selbst getestet, aber wenn Sie Thread-Sicherheit ohne den Overhead eines Sperrschemas wollen und sich keine Sorgen darüber machen, ob Sie eine Objektinstanz erstellen und verwerfen können, könnten Sie Folgendes versuchen:
%Vor%Der Aufruf von CompareExchange () führt eine atomare Ersetzung des Werts in _builder durch eine neue Instanz von StringBuilder nur dann durch, wenn _builder == null ist. Alle Methoden in der Interlocked-Klasse werden garantiert NICHT durch Threads ersetzt.
Tags und Links .net c# thread-safety null-coalescing-operator