Heim >Java >javaLernprogramm >Detaillierte Erläuterung expliziter Sperren in der gleichzeitigen Java-Programmierung
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
void LockDefinition() { Lock lock = new ReentrantLock();try {//do someting//更新对象状态,捕获异常;并在必要时恢复不变性条件} finally {//finally中释放锁 lock.unlock(); } }
lock.tryLock([Long,TimeUnit] ): Versuchen Sie, die Sperre zu erhalten, und die Zeit ist eine zeitgesteuerte Sperre
Lock.lockInterruptably();
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
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
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!