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

Übersicht über die Lock-API in Java

Linda Hamilton
Freigeben: 2024-12-31 18:59:14
Original
479 Leute haben es durchsucht

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!

Quelle:dev.to
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage