Inhaltsverzeichnis
Analyse der Quellcodeebene von Synchronized
Objektstruktur
Monitor-Objekt
Sichtbarkeit
Ordering
Wiedereintrittssperre
Der Prozess des Schloss-Upgrades
Heim Java javaLernprogramm Was ist das Prinzip von Synchronized in Java?

Was ist das Prinzip von Synchronized in Java?

May 31, 2023 pm 02:55 PM
java synchronized

    Analyse der Quellcodeebene von Synchronized

    Objektstruktur

    Der Erwerb und die Freigabe von Sperren sind sowohl implizit als auch vollständig der JVM überlassen, um uns beim Betrieb zu helfen Der erste Wissenspunkt, den es zu lernen gilt, ist die Objektstruktur von Java, da synchronisierte Sperren in Java-Objekten gespeichert sind. Die Java-Objektstruktur ist wie in der folgenden Abbildung dargestellt:

    Was ist das Prinzip von Synchronized in Java?

    Sie können deutlich erkennen, dass Java-Objekte aus drei Objekten bestehen Teile sind Objekt-Header, Instanzdaten und Fülldaten. Als nächstes führen wir eine einfache Analyse der Objektstruktur durch:

    • mark-down: Das Objektmarkierungsfeld belegt 8 Bytes Wird zum Speichern von Informationen über die Flag-Bits der Sperre und andere Informationen verwendet. Wie aus der Abbildung ersichtlich ist, gibt es Hash-Werte, Lightweight-Lock-Flag-Bits, Bias-Lock-Flag-Bits usw.

    • Klassenzeiger: Der Typzeiger des Klassenobjekts, der der Zeiger ist, zu der das aktuelle Objekt gehört. Standardmäßig belegt jdk1.8 nach dem Einschalten komprimierter Zeiger 4 Bytes und nach dem Ausschalten 8 Bytes komprimierte Zeiger.

    • Tatsächliche Daten des Objekts: Dieser Teil umfasst alle Mitgliedsvariablen des Objekts. Die Größe wird durch jede Mitgliedsvariable bestimmt. Beispielsweise belegt Byte 1 Byte, Int belegt 4 Byte.

    • Füllen Sie es aus: Dieser Teil des Inhalts dient nur der Vervollständigung des Speicherplatzes und dient als Platzhalter, da das Speicherverwaltungssystem der virtuellen HotSpot-Maschine erfordert, dass die Startadresse des Objekts ein ganzzahliges Vielfaches von 8 Bytes sein muss. Wenn die Objektinstanz nicht ausgerichtet ist, muss sie daher gefüllt werden, um sie zu ergänzen.

    In der Mark-Down-Sperrtypmarkierung können Sie sehen, dass es insgesamt fünf Typen gibt, nämlich sperrfrei, vorgespannte Sperre, leichte Sperre, schwere Sperre und GC-Markierung. Wenn Sie also nur 2-Bit verwenden mark Es kann nicht vollständig ausgedrückt werden, daher wird ein Bias-Lock-Tag eingeführt, das heißt, 001 bedeutet keine Sperre und 101 bedeutet Bias-Lock.

    Monitor-Objekt

    Die Objektstruktur wird oben vorgestellt. Sie können sehen, dass in Mark-down unterschiedliche Sperrinformationen gespeichert werden. Wenn der Sperrstatus Schwergewichtssperre (10) ist, wird in Mark-Down ein Zeiger auf Monitor gespeichert. down Zeiger auf das Objekt. Dieses Monitorobjekt wird auch als Monitorsperre bezeichnet.

    Der synchronisierte Betriebsmechanismus besteht darin, dass die JVM automatisch zu einer geeigneten Sperrimplementierung wechselt, wenn sie unterschiedliche Wettbewerbssituationen in gemeinsam genutzten Objekten erkennt. (Viele Orte sagen, dass Sperren nur aktualisiert und nicht herabgestuft werden können. Tatsächlich ist diese Aussage falsch. Im Buch „The Art of Java Concurrent Programming“ heißt es, dass voreingenommene Sperren auf eine Sperre herabgestuft werden können. Freier Zustand, und es wird auch voreingenommener Sperrenwiderruf genannt).

    Derzeit gibt es drei verschiedene Monitor-Implementierungen, nämlich voreingenommene Sperren, leichte Sperren und schwere Sperren. Wenn ein Thread einen Monitor hält, erhält er die Sperre.

    Monitor in Java wird basierend auf ObjectMonitor von C++ implementiert. Zu seinen Hauptmitgliedern gehören:

    • _owner: zeigt auf den Thread, der das ObjectMonitor-Objekt enthält.

    • _WaitSet: speichert die Thread-Warteschlange im Wartezustand, d. h. Aufrufe wait()-Methode Thread

    • _EntryList: speichert die Thread-Warteschlange, die auf den Sperrstatus wartet.

    • _count: ungefähr die Summe der Anzahl der Knoten von _WaitSet+_EntryList

    • _cxq: mehrere Threads, die um den konkurrieren sperren, Es wird zuerst in dieser einseitig verknüpften Liste gespeichert

    • _Rekursionen: Zeichnen Sie die Anzahl der erneuten Einträge auf

    • _object: Das gespeicherte Monitorobjekt

    Wenn der Thread, der das Monitorobjekt erhält, den _owner betritt Bereich, _count+1, wenn der Thread Wenn die Methode wait() aufgerufen wird, wird das Monitor-Objekt freigegeben (Sperre aufgehoben), _owner wird auf leer zurückgesetzt und _count-1. Zu diesem Zeitpunkt tritt der Thread in die _WaitSet-Warteschlange ein und wartet darauf, geweckt zu werden.

    Aus der obigen Beschreibung ist ersichtlich, dass der Schlüssel zum Erhalten der Sperre mit dem synchronisierten Schlüsselwort im Objektheader jedes Objekts liegt. Dies erklärt auch, warum jedes in den Synchronized()-Klammern gespeicherte Objekt die Sperre erhalten kann.

    Synchronisierte Funktionen

    Atomizität

    Atomizität bedeutet, dass ein Vorgang entweder abgeschlossen oder nicht abgeschlossen ist. Es gibt keine halb abgeschlossene Situation, was bedeutet, dass dieser Vorgang nicht unterbrechbar ist.

    synchronisiert kann sicherstellen, dass nur ein Thread gleichzeitig die Sperre erhält und den Codeblock eingibt, um den Code auszuführen. Wenn Sie dies nicht verstehen, stellen Sie sich die folgende Szene vor: Es gibt eine Toilette mit nur einer Grube Um das unzivilisierte Phänomen zu verhindern, dass mehrere Personen gleichzeitig auf die Toilette gehen, müssen alle zum Bezahlen zum Toilettenmanager gehen Auf der Toilette geben sie den Beutel an den Toilettenmanager zurück, synchronisiert ist der Toilettenmanager, der dafür sorgt, dass jeweils nur eine Person das Schloss erhalten kann und jeder den Schlüssel nach der Toilettenbenutzung zurückgeben muss.

    Als nächstes sehen Sie sich die folgende synchrone Additionsmethode an:

    public static void add() {
        synchronized (Demo.class) {
            counter++;
        }
    }
    Nach dem Login kopieren

    Dekompilieren Sie sie und sehen Sie sich den Code an:

    javap -v -p Demo

    public static void add();
        descriptor: ()V
        flags: ACC_PUBLIC, ACC_STATIC , ACC_SYNCHRONIZED
        Code:
          stack=2, locals=2, args_size=0
             0: ldc           #12                 // class
             2: dup
             3: astore_0
             4: monitorenter
             5: getstatic     #10                 // Field counter:I
             8: iconst_1
             9: iadd
            10: putstatic     #10                 // Field counter:I
            13: aload_0
            14: monitorexit
            15: goto          23
            18: astore_1
            19: aload_0
            20: monitorexit
            21: aload_1
            22: athrow
            23: return
          Exception table:
    Nach dem Login kopieren

    Sie können sehen, dass es offensichtlich zwei Anweisungen gibt, die sich auf den Monitor beziehen:

    • monitorenter: Nachdem festgestellt wurde, dass es das Synchronisationsflag ACC_SYNCHRONIZED hat, hat der Thread, der diese Methode zuerst aufruft, zuerst den Besitzer des Monitors. Zu diesem Zeitpunkt ist der Zähler +1

    • monitorexit: Wenn die Ausführung abgeschlossen ist und beendet, der Zähler -1, kehrt zu 0 zurück und wird durch andere ersetzt. Der eingehende Thread erhält

    Sichtbarkeit

    Sichtbarkeit bedeutet, dass, wenn mehrere Threads auf dieselbe Variable zugreifen und ein Thread den Wert dieser Variablen ändert, andere Threads kann es sofort spüren und den veränderten Wert sehen. Die Thread-Sichtbarkeit hängt eng mit JMM zusammen. Im nächsten Artikel werden wir untersuchen, wie man das Schlüsselwort volatile verwendet, um Sichtbarkeit zu erreichen

    Und Synchronized hat Sichtbarkeit, weil es die folgende Semantik zum Sperren und Freigeben von Sperren hat:

    • Bevor ein Thread gesperrt wird, muss er gelöscht werden Wert der gemeinsam genutzten Variablen im Arbeitsspeicher und liest dabei den neuesten Wert der gemeinsam genutzten Variablen aus dem Hauptspeicher.

    • Wenn der Thread die Sperre aufhebt, muss der Wert der gemeinsam genutzten Variablen im Hauptspeicher aktualisiert werden.

    • Die Sichtbarkeit der Synchronisierung hängt von der Mutex-Implementierung des Betriebssystemkerns ab, was dem Sperren und Entsperren in der JVM entspricht. Beim Verlassen des Codeblocks müssen die gemeinsam genutzten Variablen im Hauptspeicher aktualisiert werden das Schlüsselwort volatile. Die Sichtbarkeit von Schlüsselwörtern hängt von Speicherbarrieren (auch Memory Fences genannt) ab.

    Ordering

    as-if-serial soll sicherstellen, dass unabhängig davon, wie der Compiler und der Prozessor die Anweisungen zur Leistungsoptimierung neu anordnen, die Richtigkeit der laufenden Ergebnisse unter Single-Thread sichergestellt werden muss. Das heißt: Wenn Sie innerhalb dieses Threads beobachten, sind alle Vorgänge in Ordnung, Wenn Sie einen anderen Thread in einem Thread beobachten, sind alle Vorgänge nicht in Ordnung.

    Beachten Sie, dass sich die Reihenfolge hier von der flüchtigen Reihenfolge unterscheidet. Es ist nicht flüchtig, was eine Neuordnung der Anweisungen verhindert.

    Wiedereintrittssperre

    Das Konzept einer Wiedereintrittssperre ist sehr einfach, das heißt, ein Thread kann die Objektsperre, die er hält, mehrmals erwerben. Bei dieser Art von Sperre muss die gleiche Anzahl von Sperren freigegeben werden die gleiche Sperre. Im synchronisierten Sperrobjekt gibt es einen Zähler, der die Häufigkeit des Erwerbs der Sperre aufzeichnet, also die Anzahl der Wiedereintritte.

    Der Prozess des Schloss-Upgrades

    synchronisierte Schlösser haben vier alternative Upgrade-Zustände: kein Schloss, voreingenommenes Schloss, leichtes Schloss und schweres Schloss. Diese Zustände eskalieren allmählich mit der Wettbewerbssituation. Ein vollständiges Schloss-Upgrade-Diagramm wird später hinzugefügt.

    Das obige ist der detaillierte Inhalt vonWas ist das Prinzip von Synchronized in Java?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

    Erklärung dieser Website
    Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

    Heiße KI -Werkzeuge

    Undresser.AI Undress

    Undresser.AI Undress

    KI-gestützte App zum Erstellen realistischer Aktfotos

    AI Clothes Remover

    AI Clothes Remover

    Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

    Undress AI Tool

    Undress AI Tool

    Ausziehbilder kostenlos

    Clothoff.io

    Clothoff.io

    KI-Kleiderentferner

    AI Hentai Generator

    AI Hentai Generator

    Erstellen Sie kostenlos Ai Hentai.

    Heißer Artikel

    R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
    3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
    R.E.P.O. Beste grafische Einstellungen
    3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
    R.E.P.O. So reparieren Sie Audio, wenn Sie niemanden hören können
    3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
    WWE 2K25: Wie man alles in Myrise freischaltet
    4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌

    Heiße Werkzeuge

    Notepad++7.3.1

    Notepad++7.3.1

    Einfach zu bedienender und kostenloser Code-Editor

    SublimeText3 chinesische Version

    SublimeText3 chinesische Version

    Chinesische Version, sehr einfach zu bedienen

    Senden Sie Studio 13.0.1

    Senden Sie Studio 13.0.1

    Leistungsstarke integrierte PHP-Entwicklungsumgebung

    Dreamweaver CS6

    Dreamweaver CS6

    Visuelle Webentwicklungstools

    SublimeText3 Mac-Version

    SublimeText3 Mac-Version

    Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

    Quadratwurzel in Java Quadratwurzel in Java Aug 30, 2024 pm 04:26 PM

    Leitfaden zur Quadratwurzel in Java. Hier diskutieren wir anhand eines Beispiels und seiner Code-Implementierung, wie Quadratwurzel in Java funktioniert.

    Perfekte Zahl in Java Perfekte Zahl in Java Aug 30, 2024 pm 04:28 PM

    Leitfaden zur perfekten Zahl in Java. Hier besprechen wir die Definition, Wie prüft man die perfekte Zahl in Java?, Beispiele mit Code-Implementierung.

    Zufallszahlengenerator in Java Zufallszahlengenerator in Java Aug 30, 2024 pm 04:27 PM

    Leitfaden zum Zufallszahlengenerator in Java. Hier besprechen wir Funktionen in Java anhand von Beispielen und zwei verschiedene Generatoren anhand ihrer Beispiele.

    Weka in Java Weka in Java Aug 30, 2024 pm 04:28 PM

    Leitfaden für Weka in Java. Hier besprechen wir die Einführung, die Verwendung von Weka Java, die Art der Plattform und die Vorteile anhand von Beispielen.

    Smith-Nummer in Java Smith-Nummer in Java Aug 30, 2024 pm 04:28 PM

    Leitfaden zur Smith-Zahl in Java. Hier besprechen wir die Definition: Wie überprüft man die Smith-Nummer in Java? Beispiel mit Code-Implementierung.

    Fragen zum Java Spring-Interview Fragen zum Java Spring-Interview Aug 30, 2024 pm 04:29 PM

    In diesem Artikel haben wir die am häufigsten gestellten Fragen zu Java Spring-Interviews mit ihren detaillierten Antworten zusammengestellt. Damit Sie das Interview knacken können.

    Brechen oder aus Java 8 Stream foreach zurückkehren? Brechen oder aus Java 8 Stream foreach zurückkehren? Feb 07, 2025 pm 12:09 PM

    Java 8 führt die Stream -API ein und bietet eine leistungsstarke und ausdrucksstarke Möglichkeit, Datensammlungen zu verarbeiten. Eine häufige Frage bei der Verwendung von Stream lautet jedoch: Wie kann man von einem Foreach -Betrieb brechen oder zurückkehren? Herkömmliche Schleifen ermöglichen eine frühzeitige Unterbrechung oder Rückkehr, aber die Stream's foreach -Methode unterstützt diese Methode nicht direkt. In diesem Artikel werden die Gründe erläutert und alternative Methoden zur Implementierung vorzeitiger Beendigung in Strahlverarbeitungssystemen erforscht. Weitere Lektüre: Java Stream API -Verbesserungen Stream foreach verstehen Die Foreach -Methode ist ein Terminalbetrieb, der einen Vorgang für jedes Element im Stream ausführt. Seine Designabsicht ist

    Zeitstempel für Datum in Java Zeitstempel für Datum in Java Aug 30, 2024 pm 04:28 PM

    Anleitung zum TimeStamp to Date in Java. Hier diskutieren wir auch die Einführung und wie man Zeitstempel in Java in ein Datum konvertiert, zusammen mit Beispielen.

    See all articles