Was ist der Unterschied zwischen einer exklusiven Sperre und einer gemeinsam genutzten Sperre?


118

Laut Wikipedia

Freigegebene Sperren werden manchmal als "Lesesperren" bezeichnet, und exklusive Sperren werden manchmal als "Schreibsperren" bezeichnet.

Können Sie die Gründe für die Begriffe "geteilt" und "exklusiv" erklären?


Ist eine nicht exklusive Sperre ein anderer Name für eine gemeinsam genutzte Sperre?
Ramesh Papaganti

Antworten:


417

Ich habe diese Antwort aufgeschrieben, weil ich dachte, dies wäre eine lustige (und passende) Analogie:

Stellen Sie sich ein abschließbares Objekt als eine Tafel (abschließbar) in einem Klassenzimmer vor, in der sich ein Lehrer (Schriftsteller) und viele Schüler (Leser) befinden.

Während ein Lehrer etwas (exklusives Schloss) an die Tafel schreibt:

  1. Niemand kann es lesen, weil es noch geschrieben wird und sie Ihre Ansicht blockiert => Wenn ein Objekt ausschließlich gesperrt ist, können keine freigegebenen Sperren erhalten werden .

  2. Andere Lehrer kommen ebenfalls nicht zum Schreiben oder die Tafel wird unlesbar und verwirrt die Schüler => Wenn ein Objekt ausschließlich gesperrt ist, können keine anderen exklusiven Sperren erhalten werden .

Wenn die Schüler lesen (gemeinsame Schlösser), was sich auf der Tafel befindet:

  1. Sie alle können gemeinsam lesen, was darauf steht => Es können mehrere gemeinsam genutzte Sperren nebeneinander existieren .

  2. Die Lehrerin wartet darauf, dass sie mit dem Lesen fertig ist, bevor sie die Tafel freigibt, um mehr zu schreiben => Wenn bereits eine oder mehrere gemeinsam genutzte Sperren vorhanden sind, können keine exklusiven Sperren erhalten werden .


2
sehr gute Erklärung. Die PO fragte jedoch nach der Herkunft von "geteilten" und "exklusiven" Konfessionen, nicht nach einer Erklärung der Thermik an sich.
Serhio

Ist dies "Wenn eine oder mehrere gemeinsam genutzte Sperren bereits vorhanden sind, können keine exklusiven Sperren erhalten werden." ist wahr? Zwischenzeiten von ReentrantReadWriteLock? Ich dachte, die Schreibsperre kann jederzeit erreicht werden, andernfalls kann es aufgrund des kontinuierlichen Lesens zu einem Hunger beim Schreiben kommen.
Kanagavelu Sugumar

1
@ KanagaveluSugumar, ja, es ist wahr. Sie können einfach keine Schreibsperre erhalten, wenn eine andere Entität bereits eine Lesesperre für dasselbe Objekt besitzt. Das ist der springende Punkt einer Lese- / Schreibsperre. Wenn Sie etwas überschreiben, während jemand anderes es liest, was würden sie dann lesen? Ich weiß nicht, warum Sie sich speziell für eine Lese- / Schreibsperre für "Wiedereinsteiger" entschieden haben, aber Wiedereintritt bedeutet, dass der Besitzer einer Wiedereintrittssperre sie erneut sperren () und alle nachfolgenden lock()Aufrufe danach ausführen kann Der erste wird sofort und erfolgreich zurückkehren. dh Sie können erfolgreich etwas sperren, das Sie bereits besitzen.
ArjunShankar

2
Sie erwähnen auch, dass "ich dachte, dass die Schreibsperre jederzeit erhalten werden kann, andernfalls kann es aufgrund des kontinuierlichen Lesens zu einem Hungermangel beim Schreiben kommen" - dies kann einfach nicht sein. Eine Schreibsperre kann nicht erhalten werden, während eine andere Entität bereits eine Lese- / Schreibsperre besitzt. Was passieren kann ist, dass, wenn bereits mehrere Entitäten darauf warten, ein Objekt zu sperren, ein Warten writerden wartenden Lesern den Vorzug gibt, wenn die Sperre auswählt, wer die Sperre als nächstes erhält (wenn sie von ihrem aktuellen Eigentümer entsperrt wird). Hier geht es um Politik .
ArjunShankar

Danke dir! Ich habe ReentrantReadWriteLock gewählt. da dies die Implementierungsklasse für ReadWriteLock in Java ist. Gibt es dann ein Flag oder eine höhere Priorität, um weitere neue Lesethreads anzuzeigen, die warten sollen, wenn der Schreibthread gestartet wird? Wie kann man das Verhungern des Schreib-Threads aufgrund einer kontinuierlichen Leseanforderung vermeiden?
Kanagavelu Sugumar

33

Es ist ziemlich einfach. Lesesperren werden auch als gemeinsam genutzte Sperren bezeichnet, da mehrere Prozesse gleichzeitig lesen können. Der Sinn einer Lesesperre besteht darin, die Erfassung einer Schreibsperre durch einen anderen Prozess zu verhindern. Im Gegensatz dazu verhindert eine Schreibsperre alle anderen Operationen, während eine Schreiboperation abgeschlossen wird, weshalb sie als exklusiv beschrieben wird.

Eine Lesesperre sagt also "Sie können jetzt lesen, aber wenn Sie schreiben möchten, müssen Sie warten", während eine Schreibsperre sagt "Sie müssen warten".


Mir ist klar, dass Sie zur Unterstützung Ihres Studiums recherchieren, aber ich kann dem Drang zum Vortrag nicht widerstehen.

Die inkompetente Verwendung von Sperren ist eine Hauptursache für Leistungsprobleme. Die Verwendung eines Schließsystems, das Lese- und Schreibsperren unterscheidet, ist ein guter Anfang, aber eine sorgfältige Konstruktion kann manchmal einen Großteil der Sperren überflüssig machen. Beispielsweise sollte der Sitzungsstatus niemals in einer globalen Sammlung pro Statuselement gespeichert werden.

Ich habe das tatsächlich gesehen. Es ist ein grausames Design, das bei jeder letzten Änderung des Sitzungsstatus zu Boxen und einer Änderung einer Sammlung führt und eine langwierige Schreibsperre zur Folge hat. Overheads waren lähmend und reduzierten den Server effektiv auf Single-Threaded-Verhalten.

Das einfache Zusammenfassen des gesamten Sitzungsstatus zu einer Struktur war eine enorme Verbesserung. Änderungen am Sitzungsstatus haben lediglich die Werte der Mitglieder der Statusstruktur einer Sitzung geändert. Da keine andere Sitzung Gelegenheit oder Gelegenheit hatte, direkt auf den Status einer Sitzung zu verweisen, wurde nur die Liste der Sitzungen aktualisiert. Infolgedessen war das Sperren während einer Sitzung nur zu Beginn und am Ende völlig unnötig , und der Durchsatz stieg um den Faktor 3000.

Das andere häufige Sperrszenario sind Ressourcen, die von Threads einer Benutzeranwendung gemeinsam genutzt werden. Die meisten modernen Frameworks adressieren dies eher mit Nachrichten als mit Sperren. Wenn Sie "zum UI-Thread wechseln", stellen Sie tatsächlich eine Nachricht in die Warteschlange, die einen Funktionszeiger und einige Parameter enthält (oder einen Delegaten und einen Stapelrahmen, abhängig von der Implementierung).


6
  • Eine Exklusiv- oder Schreibsperre ermöglicht einem Prozess exklusiven Zugriff zum Schreiben auf den angegebenen Teil der Datei. Während eine Schreibsperre vorhanden ist, kann kein anderer Prozess diesen Teil der Datei sperren.

  • Eine gemeinsame oder Lesesperre verhindert, dass andere Prozesse eine Schreibsperre für den angegebenen Teil der Datei anfordern. Andere Prozesse können jedoch Lesesperren anfordern.

Mehr dazu: http://www.gnu.org/software/libc/manual/html_node/File-Locks.html


2

Prinzip auch auf der Datenbankseite. Gemäß der Oracle-Dokumentation

Der exklusive Sperrmodus verhindert, dass die zugehörige Ressource gemeinsam genutzt wird. Dieser Sperrmodus wird zum Ändern von Daten verwendet. Die erste Transaktion, die ausschließlich eine Ressource sperrt, ist die einzige Transaktion, die die Ressource ändern kann, bis die exklusive Sperre aufgehoben wird.

Im Freigabesperrmodus kann die zugeordnete Ressource abhängig von den beteiligten Vorgängen freigegeben werden. Mehrere Benutzer, die Daten lesen, können die Daten gemeinsam nutzen und Freigabesperren halten, um den gleichzeitigen Zugriff eines Schreibers (der eine exklusive Sperre benötigt) zu verhindern. Mehrere Transaktionen können
Freigabesperren für dieselbe Ressource erwerben.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.