Mit welchem ​​Primitiv wird das synchronisierte Schlüsselwort implementiert?

8

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?

    
NINCOMPOOP 28.03.2013, 14:31
quelle

2 Antworten

10

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):

monitorenter Snippet

  

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.

monitorexit Snippet

  

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 .

    
hyde 28.03.2013, 14:45
quelle
7

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.

    
NPE 28.03.2013 14:37
quelle