suchen
HeimJavajavaLernprogrammÜbersicht über die Lock-API in Java

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();
    }
}

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.

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

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!

Stellungnahme
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
Wie benutze ich Maven oder Gradle für das fortschrittliche Java -Projektmanagement, die Erstellung von Automatisierung und Abhängigkeitslösung?Wie benutze ich Maven oder Gradle für das fortschrittliche Java -Projektmanagement, die Erstellung von Automatisierung und Abhängigkeitslösung?Mar 17, 2025 pm 05:46 PM

In dem Artikel werden Maven und Gradle für Java -Projektmanagement, Aufbau von Automatisierung und Abhängigkeitslösung erörtert, die ihre Ansätze und Optimierungsstrategien vergleichen.

Wie erstelle und verwende ich benutzerdefinierte Java -Bibliotheken (JAR -Dateien) mit ordnungsgemäßem Versioning und Abhängigkeitsmanagement?Wie erstelle und verwende ich benutzerdefinierte Java -Bibliotheken (JAR -Dateien) mit ordnungsgemäßem Versioning und Abhängigkeitsmanagement?Mar 17, 2025 pm 05:45 PM

In dem Artikel werden benutzerdefinierte Java -Bibliotheken (JAR -Dateien) mit ordnungsgemäßem Versioning- und Abhängigkeitsmanagement erstellt und verwendet, wobei Tools wie Maven und Gradle verwendet werden.

Wie implementiere ich mehrstufige Caching in Java-Anwendungen mit Bibliotheken wie Koffein oder Guava-Cache?Wie implementiere ich mehrstufige Caching in Java-Anwendungen mit Bibliotheken wie Koffein oder Guava-Cache?Mar 17, 2025 pm 05:44 PM

In dem Artikel wird in der Implementierung von mehrstufigem Caching in Java mithilfe von Koffein- und Guava-Cache zur Verbesserung der Anwendungsleistung erläutert. Es deckt die Einrichtungs-, Integrations- und Leistungsvorteile sowie die Bestrafung des Konfigurations- und Räumungsrichtlinienmanagements ab

Wie kann ich JPA (Java Persistence-API) für Objektrelationszuordnungen mit erweiterten Funktionen wie Caching und faulen Laden verwenden?Wie kann ich JPA (Java Persistence-API) für Objektrelationszuordnungen mit erweiterten Funktionen wie Caching und faulen Laden verwenden?Mar 17, 2025 pm 05:43 PM

In dem Artikel werden mit JPA für Objektrelationszuordnungen mit erweiterten Funktionen wie Caching und faulen Laden erläutert. Es deckt Setup, Entity -Mapping und Best Practices zur Optimierung der Leistung ab und hebt potenzielle Fallstricke hervor. [159 Charaktere]

Wie funktioniert der Klassenladungsmechanismus von Java, einschließlich verschiedener Klassenloader und deren Delegationsmodelle?Wie funktioniert der Klassenladungsmechanismus von Java, einschließlich verschiedener Klassenloader und deren Delegationsmodelle?Mar 17, 2025 pm 05:35 PM

Mit der Klassenbelastung von Java wird das Laden, Verknüpfen und Initialisieren von Klassen mithilfe eines hierarchischen Systems mit Bootstrap-, Erweiterungs- und Anwendungsklassenloadern umfasst. Das übergeordnete Delegationsmodell stellt sicher

See all articles

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)
1 Monate vorBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Beste grafische Einstellungen
1 Monate vorBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. So reparieren Sie Audio, wenn Sie niemanden hören können
1 Monate vorBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Chat -Befehle und wie man sie benutzt
1 Monate vorBy尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

PHPStorm Mac-Version

PHPStorm Mac-Version

Das neueste (2018.2.1) professionelle, integrierte PHP-Entwicklungstool

Sicherer Prüfungsbrowser

Sicherer Prüfungsbrowser

Safe Exam Browser ist eine sichere Browserumgebung für die sichere Teilnahme an Online-Prüfungen. Diese Software verwandelt jeden Computer in einen sicheren Arbeitsplatz. Es kontrolliert den Zugriff auf alle Dienstprogramme und verhindert, dass Schüler nicht autorisierte Ressourcen nutzen.

SublimeText3 Linux neue Version

SublimeText3 Linux neue Version

SublimeText3 Linux neueste Version

MinGW – Minimalistisches GNU für Windows

MinGW – Minimalistisches GNU für Windows

Dieses Projekt wird derzeit auf osdn.net/projects/mingw migriert. Sie können uns dort weiterhin folgen. MinGW: Eine native Windows-Portierung der GNU Compiler Collection (GCC), frei verteilbare Importbibliotheken und Header-Dateien zum Erstellen nativer Windows-Anwendungen, einschließlich Erweiterungen der MSVC-Laufzeit zur Unterstützung der C99-Funktionalität. Die gesamte MinGW-Software kann auf 64-Bit-Windows-Plattformen ausgeführt werden.