Heim >Java >javaLernprogramm >Ü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.
Lock API ist eine Schnittstelle und stellt die folgenden Methoden zur Verarbeitung der Thread-Synchronisierung bereit.
ReentrantLock
ReentrantLock lock = new ReentrantLock(true); //fair lock public void methodExecution() { lock.lock(); try { // Critical section here } finally { lock.unlock(); } }
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.
Wichtige Regeln
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 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.
Wichtige Punkte:
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!