Warum ist dieser Code nicht Thread-sicher?

8

Im unten stehenden Codefragment würde das Deklarieren der doThings () -Methode als statisch die Klasse threadsicher machen. Ist der Grund dafür, dass wenn mehrere TestSeven-Threads gestartet werden und da x eine statische Variable ist, eine Race-Bedingung auftreten könnte?

%Vor%     
blue-sky 25.11.2011, 11:09
quelle

5 Antworten

15

Ja genau. Die Eigenschaft synchronized von doThings verhindert nur, dass sie gleichzeitig von mehreren Threads auf derselben Instanz aufgerufen wird. Die Variable x wird auf einer globalen Basis geteilt, nicht pro Instanz, daher ist sie unsicher.

In der realen Welt, denken Sie an es als ein Badezimmer mit mehreren Türen - jemand kann eine Tür öffnen und dann abschließen, aber das hindert jemand anderes nicht daran, über eine andere Tür hereinzukommen ...

    
Jon Skeet 25.11.2011, 11:15
quelle
1

Ich denke, wenn die Methode nicht statisch ist, würde jedes TestSeven-Objekt mit seiner eigenen Sperre synchronisieren - so wird es einen Thread pro Sperre geben, und keiner von ihnen muss auf einen anderen Thread warten. Wenn die Methode als statisch deklariert wird, kann ich mich daran erinnern, dass sie das entsprechende Klassenobjekt sperren.

    
Vlad 25.11.2011 11:16
quelle
1

Nur wenn Sie die Methode doThings statisch deklarieren, wird sie nur für die Klassensperre und nicht für die Instanzsperrung synchronisiert, so dass sie kugelsicher ist.

    
Jan Zyka 25.11.2011 11:17
quelle
1

ja. Race-Bedingung könnte dabei auftreten. Während Sie die Methode ausführen, wird Ihre Variable nicht synchronisiert. Entsprechend der Definition der Racebedingung liest ein Thread den Wert der Variablen, während andere in der synchronisierten Methode ihn schreiben können. Also wird eine Race Condition da sein.

    
gprathour 25.11.2011 11:18
quelle
1

Sie synchronisieren Ihren Code auf this , also auf diese Instanz von TestSeven. x ist statisch und wird daher nicht gesperrt. Deshalb können Sie von verschiedenen Instanzen auf dieselbe x zugreifen. Um eine Sperre für dieses Attribut zu entfernen, müssen Sie die Klasse synchronisieren.

    
Dragos 25.11.2011 11:20
quelle

Tags und Links