Übersicht über die Lock-API in Java
Die Verwaltung des Zugriffs auf gemeinsam genutzte Ressourcen ist bei der gleichzeitigen Programmierung wichtig, um die Datenkonsistenz sicherzustellen. Herkömmlichen synchronisierten Schlüsselwörtern mangelt es an Flexibilität für komplexe Szenarien wie Fairness, sofortiges Erlangen einer Sperre, Warten auf eine bestimmte Zeit zum Erlangen einer Sperre usw. Die APIs „Lock“, „ReadWriteLock“ und „StampedLock“ wurden in Java 1.5 eingeführt, um diese Einschränkungen zu beheben und Entwicklern eine hervorragende Kontrolle zu bieten Zugriff auf gemeinsame Ressourcen. Sie sind Teil des Pakets java.util.concurrent.
API sperren
Lock API ist eine Schnittstelle und stellt die folgenden Methoden zur Verarbeitung der Thread-Synchronisierung bereit.
- void lock() Wird verwendet, um die Sperre zu erhalten. Wenn die Sperre nicht verfügbar ist, wird der Thread blockiert, bis die Sperre erworben wird.
- void lockInterruptably() Es ist dasselbe wie lock(), aber dieser Thread kann unterbrochen werden.
- boolean tryLock() Gibt true zurück, wenn die Sperre erworben wurde; andernfalls falsch. Der Thread wird nicht blockiert, wenn die Sperre nicht gewährt wird.
- boolean tryLock(long timeout, TimeUnit-Einheit) Es ist das Gleiche wie tryLock(), wartet aber nur für eine bestimmte Zeitspanne.
- void unlock()Gibt die Sperre frei.
- Bedingung newCondition() Bietet einem Thread die Möglichkeit, auf das Eintreten einer Bedingung zu warten, während der kritische Teil ausgeführt wird.
ReentrantLock
- Die ReentrantLock-Klasse implementiert die Lock-Schnittstelle.
- Eine wiedereintretende Sperre ermöglicht es einem Thread, eine Sperre mehrmals zu erwerben und mehrmals freizugeben.
- Wenn Sie eine Fairness-Richtlinie wünschen, verwenden Sie den parametrisierten Konstruktor von ReentrantLock.
- Wenn Fairness aktiviert ist, wird sichergestellt, dass der am längsten wartende Thread Zugriff auf die Sperre erhält.
- Verwenden Sie den Block „finally“, um die Sperre aufzuheben und eine Deadlock-Situation zu vermeiden.
ReentrantLock lock = new ReentrantLock(true); //fair lock public void methodExecution() { lock.lock(); try { // Critical section here } finally { lock.unlock(); } }
ReadWriteLock-API
Die ReadWriteLock-API ist eine Schnittstelle und unterhält ein Paar Sperren, um Lese- und Schreibszenarien aufrechtzuerhalten. Die Lesesperre kann gleichzeitig von mehreren Threads gehalten werden, wenn keine Autoren vorhanden sind. Die Schreibsperre ist exklusiv.
- Lock readLock() – Gibt die zum Lesen verwendete Sperre zurück.
- Lock writeLock() – Gibt die zum Schreiben verwendete Sperre zurück.
Wichtige Regeln
- Wenn Sie eine Lesesperre haben, können Sie keine Schreibsperre erwerben.
- Wenn Sie eine Schreibsperre haben, können Sie in keinem anderen Thread eine Lesesperre erwerben.
- Wenn Sie eine Schreibsperre haben, können Sie im selben Thread eine weitere Schreibsperre erwerben.
- Eine Schreibsperre ist zulässig, wenn keine andere Lese- oder Schreibsperre aktiv ist.
- Während des Wartens auf eine Schreibsperre sind keine neuen Lesesperren von anderen Threads zulässig.
ReentrantReadWriteLock
- Die ReentrantReadWriteLock-Klasse implementiert die ReadWriteLock-Schnittstelle.
- Nützlich, wenn wir mehr lesen als schreiben müssen.
Beispiel: Gehen Sie bei der Mikroservice-Kommunikation davon aus, dass Service B ein JWT von Service A erwartet. JWT wird von Service A generiert und kann einige Minuten lang zwischengespeichert werden. In diesen Szenarien ist ReentrantReadWriteLock nützlicher. Wir können den Token erneuern, wenn er abgelaufen ist oder bald abläuft. Ich erwerbe hier keine Lesesperre, um Lesemangel zu vermeiden.
ReentrantLock lock = new ReentrantLock(true); //fair lock public void methodExecution() { lock.lock(); try { // Critical section here } finally { lock.unlock(); } }
StampedLock-API
StampedLock wurde in Java 8 eingeführt und ist eine Klasse. Es unterstützt drei Sperrmodi und gibt einen Stempel zurück, der zum Aufheben der Sperre verwendet wird. Es ermöglicht die Aktualisierung des Schlosses.
- Lesesperre Ermöglicht mehreren Threads das gleichzeitige Lesen.
- Schreibsperre Gibt eine zum Schreiben verwendete Sperre zurück.
- Optimistische Lesesperre Ermöglicht einem Thread das Lesen, ohne eine herkömmliche Lesesperre zu erwerben, was die Leistung verbessert, da Konflikte vermieden werden.
- long writeLock() Erwirbt die exklusive Sperre und blockiert sie bei Bedarf, bis sie verfügbar ist.
- void unlockWrite(long stamp) Gibt die Schreibsperre frei.
- long readLock() Erhält die Lesesperre und blockiert, wenn eine Schreibsperre ausgeführt wird.
- void unlockRead(long stamp) Gibt die Lesesperre frei.
- long tryOptimisticRead() Gibt einen Stempel zurück, der später validiert werden kann, oder Null, wenn exklusiv gesperrt.
- boolean validate(long stamp) Gibt „true“ zurück, wenn die Sperre seit der Ausstellung des angegebenen Stempels nicht ausschließlich erworben wurde (Schreibsperre); andernfalls falsch.
- long tryConvertToWriteLock(long stamp) Aktualisiert eine Lese- oder optimistische Sperre zu einer Schreibsperre. Blockiert, bis es verfügbar ist.
Wichtige Punkte:
- Es ist nicht reentrant, was bedeutet, dass ein Thread, der eine Sperre hält, diese nicht erneut erwerben kann.
- Bedingungen werden nicht unterstützt.
- Es unterstützt keine Fairness.
String jwt = JwtUtil.generateJwt(); ReadWriteLock lock = new ReentrantReadWriteLock(); Lock writeLock = lock.writeLock(); Lock readLock = lock.readLock(); public String getJwt(String key, String value) { if (StringUtils.hasLength(jwt)) { if (JwtUtil.isJwtEligibleToRenew(jwt)) { generateJwt(); } } else { generateJwt(); } return this.jwt; } public void generateJwt() { this.writeLock.lock(); //write lock try { if (JwtUtil.isJwtEligibleToRenew(jwt)) { this.jwt = JwtUtil.generateJwt(); } } finally { this.writeLock.unlock(); //release write lock } }
Optimistisches Lesebeispiel. Dadurch kann ein Thread lesen, ohne eine herkömmliche Lesesperre zu erwerben, was die Leistung verbessert, da Sperrenkonflikte vermieden werden. Wenn nach dem Erwerb einer optimistischen Lesesperrzeit eine Schreibsperre erworben wird, gibt „validate()“ „false“ zurück, andernfalls ist sie „true“.
public void readAndWrite() { long l = this.stampedLock.readLock(); try { //critical section } finally { this.stampedLock.unlock(l); } long w = this.stampedLock.writeLock(); try { //critical section } finally { this.stampedLock.unlock(w); } }
Viel Spaß beim Programmieren und Lernen !!!
Bitte hinterlassen Sie einen Kommentar, wenn Sie Fragen haben.
Das obige ist der detaillierte Inhalt vonÜbersicht über die Lock-API 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

Fehlerbehebung und Lösungen für die Sicherheitssoftware des Unternehmens, die dazu führt, dass einige Anwendungen nicht ordnungsgemäß funktionieren. Viele Unternehmen werden Sicherheitssoftware bereitstellen, um die interne Netzwerksicherheit zu gewährleisten. ...

Die Verarbeitung von Feldzuordnungen im Systemdocken stößt häufig auf ein schwieriges Problem bei der Durchführung von Systemdocken: So kartieren Sie die Schnittstellenfelder des Systems und ...

Bei Verwendung von MyBatis-Plus oder anderen ORM-Frameworks für Datenbankvorgänge müssen häufig Abfragebedingungen basierend auf dem Attributnamen der Entitätsklasse erstellt werden. Wenn Sie jedes Mal manuell ...

Lösungen zum Umwandeln von Namen in Zahlen zur Implementierung der Sortierung in vielen Anwendungsszenarien müssen Benutzer möglicherweise in Gruppen sortieren, insbesondere in einem ...

Beginnen Sie den Frühling mit der Intellijideaultimate -Version ...

Konvertierung von Java-Objekten und -Arrays: Eingehende Diskussion der Risiken und korrekten Methoden zur Konvertierung des Guss-Typs Viele Java-Anfänger werden auf die Umwandlung eines Objekts in ein Array stoßen ...

Detaillierte Erläuterung des Designs von SKU- und SPU-Tabellen auf E-Commerce-Plattformen In diesem Artikel werden die Datenbankdesignprobleme von SKU und SPU in E-Commerce-Plattformen erörtert, insbesondere wie man mit benutzerdefinierten Verkäufen umgeht ...

Wenn Sie TKMybatis für Datenbankabfragen verwenden, ist das Aufbau von Abfragebedingungen ein häufiges Problem. Dieser Artikel wird ...
