Ist das C # '??' Bediener Thread sicher?

8

Jeder weiß, dass dies nicht Thread-sicher ist:

%Vor%

Was ist damit?

%Vor%     
Arsen Mkrtchyan 03.06.2009, 13:17
quelle

6 Antworten

10

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.

    
Michael Meadows 03.06.2009, 13:19
quelle
10

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.

    
Marc Gravell 03.06.2009 13:19
quelle
8

NEIN für beide Versionen

    
van 03.06.2009 13:18
quelle
2

Nein, auch nicht atomar

    
AgileJon 03.06.2009 13:19
quelle
2

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.

    
Lucero 03.06.2009 13:26
quelle
2

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.

    
LBushkin 03.06.2009 13:39
quelle