Java-Sperren: Wie erfolgt die Gleichheitsprüfung für Monitor-Sperren im synchronisierten Block?

8

Wenn Sie ein paar synchronized Blöcke auf einem Objekt haben (sagen wir) obj , wie prüft Java dann, ob alle diese obj s gleich oder verschieden sind?

Zum Beispiel:

%Vor%

Wenn die obige Funktion f gleichzeitig von zwei Threads aufgerufen wird, blockieren sie dann die andere? Beachten Sie, dass jeder Thread eine neue Instanz von String object erhält.

Um dies zu überprüfen, habe ich den folgenden Testcode geschrieben, und es scheint tatsächlich, dass der obige Block funktioniert, aber dann gibt es andere unerwartete Ergebnisse.

%Vor%

Wenn Sie den obigen Code ausführen, erhalten Sie die folgende Ausgabe: -

%Vor%

Wenn ich jedoch die Zeilen f1("A", "Str"); und f1("B", "Str"); kommentiere und die Zeilen über ihnen auskommentiere, lautet das Ergebnis: -

%Vor%

Da die Str Version funktionierte, erwartete ich, dass Java equals check für synchronized block oder vielleicht hashCode verwendet, aber vom zweiten Test an scheint es so zu sein.

>

Ist String ein Sonderfall?

    
AppleGrew 27.08.2012, 10:00
quelle

1 Antwort

18

Nein, Java verwendet equals nicht für Sperrmonitore.

Die Sperre befindet sich in der Objektinstanz selbst. In gewisser Weise verwendet es "==", wenn Sie es wollen (aber in Wirklichkeit ist dies nicht so, wie es implementiert ist. Jedes Objekt hat einen speziellen Slot für den aktuellen Besitzer der Sperre).

Es gibt keinen speziellen Fall für String.

Was jedoch mit Strings passiert, ist, dass String-Literale gepoolt werden, und wenn Sie dasselbe Literal mehr als einmal haben, wird es dieselbe Instanz ergeben (während new X verschiedene Instanzen erzeugt, wie auch new String ). Wenn Sie intern auf Ihren "neuen" Strings aufrufen, sehen Sie wahrscheinlich den gleichen Effekt.

    
Thilo 27.08.2012, 10:02
quelle