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% 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 ...
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.
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.
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.