Heim Java javaLernprogramm Übersicht über die Lock-API in Java

Übersicht über die Lock-API in Java

Dec 31, 2024 pm 06:59 PM

Overview of 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();
    }
}
Nach dem Login kopieren
Nach dem Login kopieren

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();
    }
}
Nach dem Login kopieren
Nach dem Login kopieren

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.

  1. Lesesperre Ermöglicht mehreren Threads das gleichzeitige Lesen.
  2. Schreibsperre Gibt eine zum Schreiben verwendete Sperre zurück.
  3. 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
    }
}
Nach dem Login kopieren

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);
    }
}
Nach dem Login kopieren

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!

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

Video Face Swap

Video Face Swap

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

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)

Verursacht die Sicherheitssoftware des Unternehmens, die die Anwendung nicht ausführt? Wie kann man es beheben und es lösen? Verursacht die Sicherheitssoftware des Unternehmens, die die Anwendung nicht ausführt? Wie kann man es beheben und es lösen? Apr 19, 2025 pm 04:51 PM

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. ...

Wie vereinfachte ich Probleme mit der Feldzuordnung im Systemdocking mithilfe des Mapstruct? Wie vereinfachte ich Probleme mit der Feldzuordnung im Systemdocking mithilfe des Mapstruct? Apr 19, 2025 pm 06:21 PM

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 ...

Wie kann ich elegante Entitätsklassenvariablennamen erhalten, um Datenbankabfragebedingungen zu erstellen? Wie kann ich elegante Entitätsklassenvariablennamen erhalten, um Datenbankabfragebedingungen zu erstellen? Apr 19, 2025 pm 11:42 PM

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 ...

Wie konvertiere ich Namen in Zahlen, um die Sortierung zu implementieren und die Konsistenz in Gruppen aufrechtzuerhalten? Wie konvertiere ich Namen in Zahlen, um die Sortierung zu implementieren und die Konsistenz in Gruppen aufrechtzuerhalten? Apr 19, 2025 pm 11:30 PM

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 ...

Wie identifiziert Intellij IDEA die Portnummer eines Spring -Boot -Projekts, ohne ein Protokoll auszugeben? Wie identifiziert Intellij IDEA die Portnummer eines Spring -Boot -Projekts, ohne ein Protokoll auszugeben? Apr 19, 2025 pm 11:45 PM

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

Wie kann ich Java -Objekte sicher in Arrays umwandeln? Wie kann ich Java -Objekte sicher in Arrays umwandeln? Apr 19, 2025 pm 11:33 PM

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 ...

E-Commerce-Plattform SKU und SPU-Datenbankdesign: Wie berücksichtigen Sie sowohl benutzerdefinierte Attribute als auch Attributloses Produkte? E-Commerce-Plattform SKU und SPU-Datenbankdesign: Wie berücksichtigen Sie sowohl benutzerdefinierte Attribute als auch Attributloses Produkte? Apr 19, 2025 pm 11:27 PM

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 ...

Wie kann ich elegant den variablen Entitätsklassennamen erstellen, wenn Tkmybatis für Datenbankabfrage verwendet werden? Wie kann ich elegant den variablen Entitätsklassennamen erstellen, wenn Tkmybatis für Datenbankabfrage verwendet werden? Apr 19, 2025 pm 09:51 PM

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

See all articles