Wenn der Thread T1 f () läuft, der synchronisiert ist, kann Thread t2 g () ausführen, der zum selben Zeitpunkt nicht synchronisiert ist, während T1 noch läuft f ()?
Nicht in der gleichen Instanz von A. Die Instanz selbst ist die Sperre, so dass zwei die zwei Methoden gleichzeitig mit zwei Threads ausführen, die Sie zwei Instanzen von A benötigen würden.
Ja. Beide Methoden können zur selben Zeit auf derselben Instanz ausgeführt werden.
Nur f()
ist synchronisiert. Ein Thread muss den Monitor für this.f()
erwerben, um f()
auszuführen, und pro Instanz existiert nur ein Monitor.
g()
ist nicht synchronisiert, es ist keine Monitorsperrung erforderlich, um die Methode auszuführen, daher kann jeder Thread g()
jederzeit ausführen.
"Eine synchronisierte Methode erhält vor ihrer Ausführung einen Monitor (§17.1)."
Nein. Ein Anruf wird blockiert, bis der andere beendet ist. Der Grund dafür ist, dass das synchronisierte Schlüsselwort für eine Methode zur Synchronisierung für die aktuelle Instanz des Objekts erweitert wird. Um genauer zu sein, bedenken Sie diesen Code:
%Vor%Der obige Code ist in der Funktionalität mit dem folgenden Code identisch:
%Vor%Wenn also zwei Methoden in einem Objekt nur miteinander synchronisiert werden sollen, sollten Sie zwei Sperrobjekte erstellen. Jede Methode sollte ihren gesamten Code in einen synchronisierten (Objekt-) Block einbinden, ein Objekt für jede Methode.
Ja, wenn T1 und T2 f
bzw. g
auf verschiedenen Instanzen von A ausführen.
Wenn beide Threads eine Methode für dieselbe Instanz von A ausführen, kann nur eine Methode gleichzeitig eine Methode ausführen. Wenn T1 zuerst ausgeführt wird, erhält es die Sperre für die Instanz von A und führt die Methode f
aus. Thread T2 kann die Methode g
erst ausführen, nachdem T1 die Ausführung von f
beendet hat. Oder das Gegenteil könnte passieren: T2 könnte g
zuerst ausführen, und T1 kann f
erst nach Abschluss von T2 ausführen.
Im Allgemeinen können zwei Threads zwei Methoden zum selben Zeitpunkt ausführen. In Ihrem Beispiel könnte jedoch nur ein Thread f()
oder g()
zu einem bestimmten Zeitpunkt ausführen.
Mit dem Schlüsselwort synchronized
werden die Thread-Interaktionen geändert. Jedes Java-Objekt hat eine Sperre, ein Element, das nur ein Thread zu einem bestimmten Zeitpunkt halten kann. Synchronized
ist ein Befehl, der die Threads vor der Ausführung einer Methode anweist, die Sperre zu übernehmen und sie anschließend freizugeben. Die Sperre wird während der gesamten Ausführung der Methode gehalten.
In Ihrem Beispiel wird immer nur ein Thread f()
oder g()
ausführen, weil der "andere" Thread darauf wartet, die Sperre zu übernehmen.
Wenn Sie zwei Objekte der gleichen Klasse haben, haben Sie zwei Sperren. Das bedeutet, dass Sie zwei Threads zum Ausführen von f()
und g()
gleichzeitig mit den synchronized
-Schlüsseln erhalten können, da die Threads Sperren für verschiedene Objekte erfassen. Sie können keine Threads gleichzeitig für dasselbe Objekt ausführen, ohne das Schlüsselwort synchronized
zu entfernen.
Die richtige Antwort ist die Antwort des Assembler.
Führen Sie das aus und Sie werden sehen. Sie können auch Thread.sleep () anstelle einer Endlosschleife testen, indem Sie die entsprechenden Abschnitte des Beispiels auskommentieren / kommentieren.
Ich entschuldige mich, wenn der Code nicht den Best Practices folgt, mein Java ist ziemlich rostig.
%Vor%für das Interesse der Technik und Pedantizität, ja , könnten beide Methoden gleichzeitig eingegeben werden. man ist blockiert auf synchronisiert (this), dennoch wird die Methode eingegeben und ausgeführt, es wird die erste Anweisung ausgeführt, und die erste Bytecode-Anweisung wird ausgeführt.
Tags und Links java multithreading