Wenn wir das Schlüsselwort synchronized
in Java verwenden, welches Synchronisationsprimitiv wird genau verwendet? Lock, Semaphore, Monitor, Mutex
?
BEARBEITEN: Wie JVM die Sperre auf der nativen Ebene implementiert?
Auf Bytecode-Ebene verfügt java über die Operationen monitorenter
und monitorexit
, dokumentiert in diese Seite der Java Virtual Machine Specification , mit den unten eingefügten Snippets ( objectref ist der Operand für die Operation, vom Stack übernommen):
Jedem Objekt ist ein Monitor zugeordnet. Der Thread, der ausgeführt wird monitorenter erhält den Besitz des Monitors, der mit objectref verknüpft ist. Wenn ein anderer Thread bereits den Monitor besitzt, der objektref zugeordnet ist, wartet der aktuelle Thread, bis das Objekt vorhanden ist entriegelt, versucht dann erneut, Besitz zu gewinnen. Wenn der aktuelle Thread besitzt bereits den Monitor, der objectref zugeordnet ist, erhöht er a Zähler im Monitor, der anzeigt, wie oft dieser Thread hat betrat den Monitor. Wenn der mit objectref verknüpfte Monitor dies nicht ist Im Besitz eines beliebigen Threads wird der aktuelle Thread zum Eigentümer des Threads Überwachen Sie, indem Sie den Eintragszähler dieses Monitors auf 1 setzen.
Der aktuelle Thread sollte der Eigentümer des zugeordneten Monitors sein Die Instanz, auf die objectref verweist. Der Thread dekrementiert die Zähler, der angibt, wie oft er in diesen Monitor eingetreten ist. Ob als Ergebnis wird der Wert des Zählers Null, der aktuelle Thread gibt den Monitor frei. Wenn der Monitor mit objectref verknüpft ist wird frei, andere Threads, die auf diesen Monitor warten dürfen dies versuchen.
Also ist "monitor" die Antwort, und weder dies noch JLS, auf die in der NPE-Antwort verwiesen wird, geben an, was auf nativem Code-Level passiert. Wenn Sie eine bestimmte Plattform (CPU und Betriebssystem) und eine bestimmte JVM-Implementierung (einschließlich Version) im Hinterkopf haben, können Sie natürlich entweder die JVM-Quelle (wenn es sich um eine Open-Source-JVM handelt) oder hier fragen.
Ich bin auch in diesem Blog von 1997 vorgekommen, der mehr Details enthält .
Von der JLS ( §17.1. Synchronisation ):
Die Programmiersprache Java bietet mehrere Mechanismen für die Kommunikation zwischen Threads. Die grundlegendste dieser Methoden ist die Synchronisation, die mit Monitoren implementiert wird. Jedes Objekt in Java ist einem Monitor zugeordnet, den ein Thread sperren oder entsperren kann. Nur jeweils ein Thread kann eine Sperre auf einem Monitor halten. Alle anderen Threads, die versuchen, diesen Monitor zu sperren, werden blockiert, bis sie eine Sperre für diesen Monitor erhalten können. Ein Thread t kann einen bestimmten Monitor mehrere Male sperren; Bei jedem Entsperren wird der Effekt einer Sperroperation umgekehrt.
Also "Monitor" ist die Antwort auf Ihre erste Frage.
Was die zweite Frage betrifft, ist dies ein nicht spezifiziertes Implementierungsdetail.
Tags und Links java multithreading synchronized