


So implementieren Sie den Mechanismus zur Erweiterung der synchronisierten Sperre in Java
synchronisiert
In JDK 1.5 muss die Synchronisierung durch Aufrufen der Monitorsperre (Monitor) implementiert werden. Die Monitorsperre hängt im Wesentlichen von der Mutex-Sperre (Mutex-Sperre) des zugrunde liegenden Betriebssystems ab Wenn es freigegeben und erworben wird, muss es vom Benutzerstatus in den Kernelstatus konvertiert werden, was hohe Kosten verursacht und eine lange Ausführungszeit erfordert. Wir nennen diese Art von Sperre, die auf der Mutex-Sperrimplementierung des Betriebssystems basiert, ein „Schwergewicht“. sperren".
Was sind Benutzermodus und Kernelmodus?
Benutzermodus: Wenn ein Prozess den eigenen Code des Benutzers ausführt, befindet er sich im Benutzerausführungsstatus. Kernel-Modus: Wenn eine Aufgabe (ein Prozess) einen Systemaufruf ausführt und im Kernel-Code gefangen ist, sagen wir, dass sich der Prozess im Kernel-Laufzustand befindet. Zu diesem Zeitpunkt führt der Prozessor den Kernel-Code mit der höchsten Berechtigungsstufe aus .
Warum sind wir in Kernelmodus und Benutzermodus unterteilt?
Angenommen, es gibt keinen Unterschied zwischen Kernelmodus und Benutzermodus, kann das Programm Hardwareressourcen nach Belieben lesen und schreiben, z. B. nach Belieben lesen, schreiben und Speicher zuweisen. Auf diese Weise kann der Programmierer versehentlich unangemessene Inhalte in a schreiben Ort, an dem es nicht geschrieben werden sollte. Es ist wahrscheinlich, dass das System abstürzt.
Mit der Unterscheidung zwischen Benutzermodus und Kernelmodus führt das Programm bei der Ausführung eines Vorgangs eine Reihe von Überprüfungen und Inspektionen durch. Erst nachdem bestätigt wurde, dass kein Problem vorliegt, kann es die Ressourcen normal betreiben, sodass Sie sich keine Sorgen über versehentliche Probleme machen müssen Dies ist die Situation, in der das System beschädigt wird. Das heißt, die Unterscheidung zwischen Kernelmodus und Benutzermodus kann die Ausführung des Programms sicherer machen, gleichzeitig führt der Wechsel zwischen den beiden Modi jedoch zu einem gewissen Leistungsaufwand.
SperrenerweiterungUm den durch den Erwerb und die Freigabe von Sperren verursachten Leistungsverbrauch zu beheben, wurden in JDK 1.6 die Zustände „voreingenommene Sperre“ und „leichte Sperre“ eingeführt. Zu diesem Zeitpunkt hat der synchronisierte Zustand Folgendes Insgesamt 4 Zustände. Typen:- Kein Schloss
- Voreingenommenes Schloss
- Leichtes Schloss
- Schwergewichtiges Schloss
Die Stufen der Schlösser werden in der oben genannten Reihenfolge aufgerüstet. Wir werden upgraden Dieser Prozess wird als „Sperrenerweiterung“ bezeichnet.
PS: Bisher ist das Upgrade von Schlössern einseitig, das heißt, es kann nur von niedrig auf hoch aktualisiert werden (keine Sperre-> vorgespannte Sperre-> leichte Sperre->). ; Gewichtsstufensperre), es kommt zu keiner Sperrverschlechterung.Warum kann die Sperrerweiterung die Leistung von synchronisiert optimieren? Wenn wir diese Sperrzustände verstehen, werden wir natürlich die Antwort haben. Schauen wir uns das gemeinsam an. Voreingenommene SperreHotSpot-Autor hat durch Forschung und Praxis herausgefunden, dass es in den meisten Fällen keine Multi-Thread-Konkurrenz für Sperren gibt und diese immer mehrmals von demselben Thread erworben werden, um den Erwerb von Threads zu verbilligen Schlösser, sie führten Bias Lock ein. Voreingenommenes Sperren bedeutet, dass der erste Thread den Zugriff auf die Sperre bevorzugt. Wenn während des Betriebs nur ein Thread auf die Synchronisierungssperre zugreift und kein Multi-Thread-Konflikt vorliegt, muss der Thread nicht ausgelöst werden. Dem Thread wird eine Bias-Sperre hinzugefügt. Voreingenommener SperrenausführungsprozessWenn ein Thread auf einen synchronisierten Codeblock zugreift und eine Sperre erhält, wird die sperrenvoreingenommene Thread-ID im Markierungswort des Objektheaders gespeichert. Sie wird nicht mehr durch die CAS-Operation hinzugefügt Der Thread betritt und verlässt den synchronisierten Block und entsperrt ihn. Erkennen Sie jedoch, ob die auf den aktuellen Thread verweisende Thread-ID mit der Thread-ID, auf die zugegriffen wird, übereinstimmt Wenn die Thread-ID unterschiedlich ist, versuchen Sie, die Sperre zu erhalten. Wenn die Erfassung erfolgreich ist, geben Sie den synchronisierten Block ein, um den Code auszuführen . Vorteile von voreingenommenen SperrenVoreingenommene Sperren sollen unnötige Sperrwechsel ohne Multi-Thread-Konkurrenz minimieren, da der Erwerb und die Freigabe von Sperren auf mehreren atomaren CAS-Anweisungen basieren und nur voreingenommene Sperren erforderlich sind. Es ist erforderlich, eine atomare CAS-Anweisung auszuführen einmal beim Ersetzen der Thread-ID. Mark Word Extended Knowledge: SpeicherlayoutIn der virtuellen HotSpot-Maschine kann das Layout der im Speicher gespeicherten Objekte in die folgenden drei Bereiche unterteilt werden:
- Objektkopf (Header)
- Instanzdaten )
- Ausgerichtete Polsterung (Padding)
Mark Word (Markierungsfeld): In diesem Bereich werden unsere Bias-Lock-Informationen gespeichert .
- Klassenzeiger (Klassenobjektzeiger)
Das Layout des Objekts im Speicher ist wie folgt:
In JDK 1.6 ist die voreingenommene Sperre standardmäßig aktiviert. Sie können die voreingenommene Sperre mit dem Befehl „-XX:-UseBiasedLocking=false“ deaktivieren.
Leichte Sperre
Der Zweck der Einführung einer leichten Sperre besteht darin, den Leistungsverbrauch zu reduzieren, der durch herkömmliche schwere Sperren unter Verwendung des Betriebssystems Mutex Lock (Mutex-Sperre) ohne Multithread-Konkurrenz verursacht wird. Wenn Sie Mutex Lock verwenden, führt jeder Vorgang zum Erlangen und Freigeben einer Sperre zu einem Wechsel zwischen Benutzermodus und Kernelmodus, was zu einem enormen Leistungsaufwand für das System führt.
Wenn die Bias-Sperre deaktiviert ist oder mehrere Threads um die Bias-Sperre konkurrieren, wird die Bias-Sperre zu einer Lightweight-Sperre aktualisiert. Die Erfassung und Freigabe der Lightweight-Sperre erfolgt über CAS, und die Sperrenerfassung kann über a erfolgen Bestimmte Anzahl automatischer Sperren.
Hinweise
Es muss betont werden: Leichte Schlösser werden nicht als Ersatz für schwere Schlösser verwendet. Die ursprüngliche Absicht besteht darin, den Leistungsverbrauch zu reduzieren, der durch die Verwendung herkömmlicher schwerer Schlösser ohne Multithread-Konkurrenz verursacht wird. Das Szenario, an das sich Lightweight-Sperren anpassen, ist die Situation, in der Threads abwechselnd synchronisierte Blöcke ausführen. Wenn mehrere Threads gleichzeitig zugreifen, wird die Lightweight-Sperre zu einer Heavyweight-Sperre erweitert.
Schwergewichtige Sperresynchronisiert verwendet den Monitor, um die Methodensynchronisation oder Codeblocksynchronisation zu implementieren. Die Monitorenter-Anweisung wird nach der Kompilierung in den Anfang des synchronisierten Codeblocks eingefügt Monitorexit wird am Ende der Methode und der Ausnahme eingefügt. Jedes Objekt ist mit einem Monitor verknüpft. Wenn ein Monitor gehalten wird, befindet er sich in einem gesperrten Zustand.Der folgende Sperrcode:
public class SynchronizedToMonitorExample { public static void main(String[] args) { int count = 0; synchronized (SynchronizedToMonitorExample.class) { for (int i = 0; i < 10; i++) { count++; } } System.out.println(count); } }
Nachdem wir den obigen Code in Bytecode kompiliert haben, sieht sein Inhalt wie folgt aus:
Das obige ist der detaillierte Inhalt vonSo implementieren Sie den Mechanismus zur Erweiterung der synchronisierten Sperre in Java. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

Video Face Swap
Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heißer Artikel

Heiße Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen





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

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.

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

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.

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

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.

Kapseln sind dreidimensionale geometrische Figuren, die aus einem Zylinder und einer Hemisphäre an beiden Enden bestehen. Das Volumen der Kapsel kann berechnet werden, indem das Volumen des Zylinders und das Volumen der Hemisphäre an beiden Enden hinzugefügt werden. In diesem Tutorial wird erörtert, wie das Volumen einer bestimmten Kapsel in Java mit verschiedenen Methoden berechnet wird. Kapselvolumenformel Die Formel für das Kapselvolumen lautet wie folgt: Kapselvolumen = zylindrisches Volumenvolumen Zwei Hemisphäre Volumen In, R: Der Radius der Hemisphäre. H: Die Höhe des Zylinders (ohne die Hemisphäre). Beispiel 1 eingeben Radius = 5 Einheiten Höhe = 10 Einheiten Ausgabe Volumen = 1570,8 Kubikeinheiten erklären Berechnen Sie das Volumen mithilfe der Formel: Volumen = π × R2 × H (4

Java ist eine beliebte Programmiersprache, die sowohl von Anfängern als auch von erfahrenen Entwicklern erlernt werden kann. Dieses Tutorial beginnt mit grundlegenden Konzepten und geht dann weiter zu fortgeschrittenen Themen. Nach der Installation des Java Development Kit können Sie das Programmieren üben, indem Sie ein einfaches „Hello, World!“-Programm erstellen. Nachdem Sie den Code verstanden haben, verwenden Sie die Eingabeaufforderung, um das Programm zu kompilieren und auszuführen. Auf der Konsole wird „Hello, World!“ ausgegeben. Mit dem Erlernen von Java beginnt Ihre Programmierreise, und wenn Sie Ihre Kenntnisse vertiefen, können Sie komplexere Anwendungen erstellen.
