Was bedeutet "inkonsistente Synchronisation"?

7

Dies ist meine Java 1.6-Klasse:

%Vor%

Findbugs sagt:

%Vor%

Was bedeutet es und was mache ich falsch? Ich versuche Probleme zu vermeiden, wenn zwei oder mehr Clients Foo.scan() gleichzeitig aufrufen.

    
yegor256 15.11.2010, 17:47
quelle

2 Antworten

15

Das liegt daran, dass Sie nur synchronisieren, wenn Sie die Variable names und nicht beim Lesen setzen. Zwischen dem Lesen und dem Schreiben könnte also ein anderer Thread ausgeführt werden, und Sie würden zwei ArrayLists erstellen und diese mit Daten füllen. Der erste, der erstellt wurde, würde GC'ed erhalten.

Sie müssen den synchronisierten Block um den Lese- und den Schreibvorgang setzen oder den synchronisierten Modifikator der Methode hinzufügen.

%Vor%     
brain 15.11.2010, 17:51
quelle
6

Das erste Mal, wenn Sie names innerhalb von scan referenzieren, liegt außerhalb von synchronized block.
Wenn z. B. scan zweimal von zwei verschiedenen Threads aufgerufen wird und names null ist, kann es wie folgt aussehen

  1. if (names == null) vom ersten Thread wird verarbeitet (zu true ).
  2. if (names == null) aus dem zweiten Thread wird verarbeitet (zu true ).
  3. Der erste Thread gibt synchronized block, assignes names und leaves synchronized block.
  4. ein
  5. Der zweite Thread gibt synchronized block, assignes names ein und verlässt synchronized block.

Nun wird names zweimal initialisiert. Und dies ist nur ein mögliches Szenario, in dem Sie unerwartete Ergebnisse erhalten.

    
Nikita Rybak 15.11.2010 17:52
quelle

Tags und Links