Heim  >  Artikel  >  Java  >  Detaillierte Erläuterung expliziter Sperren in der gleichzeitigen Java-Programmierung

Detaillierte Erläuterung expliziter Sperren in der gleichzeitigen Java-Programmierung

零下一度
零下一度Original
2017-06-25 10:26:451483Durchsuche

Explizite Sperre

1. Sperren und ReentrantLock

Sperren bieten einen bedingungslosen, abfragbaren, zeitgesteuerten und unterbrechbaren Sperrenerfassungsvorgang. Alle Sperrvorgänge und Entsperrmethoden sind explizit

ReentrantLock implementiert Lock: und bietet die gleiche Speichersemantik wie synchronisiert; es bietet auch reentrant Sperrsemantik

1. Grundlegende Semantik:

void LockDefinition() {
        Lock lock = new ReentrantLock();try {//do someting//更新对象状态,捕获异常;并在必要时恢复不变性条件} finally {//finally中释放锁            lock.unlock();
        }
    }

2. Abfragesperren und zeitgesteuerte Sperren

lock.tryLock([Long,TimeUnit] ): Versuchen Sie, die Sperre zu erhalten, und die Zeit ist eine zeitgesteuerte Sperre

3. Unterbrechbarer Sperrenerfassungsvorgang

Lock.lockInterruptably();

2. Fairness

ReentrantLock kann faire Sperren (angeforderte sequentielle Erfassung von Sperren) und unfaire Sperren erstellen ( Queue-Jumping möglich).

Warteschlangensprung: Wenn ein Thread eine unfaire Sperre anfordert und der Status der Sperre zum Zeitpunkt der Anforderung verfügbar ist, wird der Thread nicht in die Warteschlange gestellt, sondern überspringt alle wartenden Threads in der Warteschlange Warteschlange und Erhalt der Sperre;

Hinweis: Unfaire Sperren befürworten kein Warteschlangenspringen, sie können jedoch kein Warteschlangenspringen verhindern; faire Sperren werden in die Warteschlange gestellt und nacheinander ausgeführt

Unfaire Sperren sind schneller als faire Sperren, wenn der Wettbewerb hart ist. Schnell: Der Grund dafür ist, dass es eine erhebliche Verzögerung zwischen der Wiederaufnahme eines Threads in der Warteschlange und dem Beginn der Ausführung des Threads gibt

3. Lese-/Schreibsperre

ReentrantLock ist eine Standard-Mutex-Sperre, aber in einigen Szenarien, z. B.: Paralleles Lesen und Lesen kann nicht erreicht werden

ReadWriteLock Lese-/Schreibsperre: Implementieren Sie ReentrantReadWriteLock: Methode readLock Lesesperre und writeLock Schreibsperre

1. Interaktions- und Implementierungsmethode

Freigabepriorität: Wenn eine Schreibsperre aufgehoben wird und sich sowohl Lese- als auch Schreibvorgänge in der Warteschlange befinden, sollte dem Lesevorgang, dem Schreibvorgang oder dem Thread, der die Anforderung zuerst sendet, Priorität eingeräumt werden ?

Lese-Thread-Sprünge in der Warteschlange: Es gibt eine Schreibsperre, die auf die aktuelle Lesesperre wartet. Sollte also die nachfolgende Lesesperre in die Warteschlange springen und direkt lesen? Direktes Lesen verbessert die Parallelität, kann aber zu Schreibmangel und Fehlern beim Abrufen von

Wiedereintrittsfähigkeit führen: Sind Lese- und Schreibsperren wiedereintrittsfähig?

Herabstufung: Schreibsperre. Können Sie eine Lesesperre erwerben, ohne die Sperre aufzuheben, sodass die Thread-Sperre herabgestuft werden kann?

Upgrade: Kann die Lesesperre vor anderen wartenden Threads auf eine Schreibsperre aktualisiert werden? Wenn zwei Threads gleichzeitig versuchen, ein Upgrade auf Schreibsperren durchzuführen, kann es leicht zu einem Deadlock kommen

Gilt für: Datenstrukturen, die hauptsächlich Lesevorgänge

Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung expliziter Sperren in der gleichzeitigen Java-Programmierung. 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