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% 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
if (names == null)
vom ersten Thread wird verarbeitet (zu true
). if (names == null)
aus dem zweiten Thread wird verarbeitet (zu true
). synchronized
block, assignes names
und leaves synchronized
block. 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.
Tags und Links java synchronization