Heim >Backend-Entwicklung >Golang >Wozu dient die Golang-Lesesperre?
Dies liegt daran, dass mehrere Goroutinen um dieselbe Karte konkurrieren. Es gibt zwei Möglichkeiten, dieses Problem zu lösen: Eine besteht darin, sync.Map zu verwenden, und die andere darin, zu sperren. sync.map ist eine neue Funktion, die in go1.9 hinzugefügt wurde und hier vorerst nicht besprochen wird. Darüber hinaus kann das aktuelle Geschäftsszenario vollständig mit Lese-/Schreibsperren gelöst werden, daher haben wir uns für die Verwendung von Lese-/Schreibsperren entschieden.
Lese-/Schreibsperre
RWMutex ist eine Lese-/Schreibsperre, die mehrere Lesesperren oder eine Schreibsperre hinzufügen kann. Es wird häufig in Szenarien verwendet, in denen die Anzahl der Lesevorgänge viel größer ist als die Anzahl der Schreibvorgänge. (Empfohlenes Lernen: go)
func (rw *RWMutex) Lock() Schreibsperre. Wenn vor dem Hinzufügen der Schreibsperre andere Lese- und Schreibsperren vorhanden sind, wird die Sperre blockiert bis Um sicherzustellen, dass die Sperre schließlich verfügbar ist, schließt der blockierte Sperraufruf neue Leser von der erworbenen Sperre aus, d. h. die Schreibsperre ist höher als die Lesesperre Sperre erhält Priorität
func (rw *RWMutex) Unlock() Entsperren Sie die Schreibsperre. Wenn die Schreibsperre nicht ausgeführt wird, führt dies zu einem Laufzeitfehler
func (rw *RWMutex) RLock () Lesesperre kann nicht geladen werden. Wenn nur eine Lesesperre vorhanden ist, können mehrere Lesesperren geladen werden , also für das Szenario „mehr Lesen und weniger Schreiben“ geeignet
func (rw *RWMutex) RUnlock hebt die Lesesperre auf. Es hat keine Wirkung auf anderen Lesern, die gleichzeitig existieren. Wenn rw nicht zum Lesen gesperrt ist, führt der Aufruf von RUnlock zu einem Laufzeitfehler
Zusammenfassung:
Lesesperren können Lesesperren nicht blockieren
Lesesperren erforderlich um Schreibsperren zu blockieren, bis alle Lesesperren aufgehoben sind
Schreibsperren müssen Lesesperren blockieren, bis alle Schreibsperren aufgehoben sind
Schreibsperren müssen Schreibsperren blockieren
Up-Code:
type MapWithLock struct { //把读写锁和资源map封装在一起 sync.RWMutex M map[string]Kline } var KlineDataMemory = make(map[string] interface{}) var InstrLock sync.RWMutex var counter = MapWithLock{ // 生成一个带有锁和map的实例,然后就可以使用啦 InstrLock, KlineDataMemory, } . . . counter.RLock() //加读锁 for _, v := range counter.M { instrID = v.InstrumentID break } counter.RUnlock() //解除读锁 加锁和解锁必须成对出现,并且建议放在同一层次的代码块中
Das obige ist der detaillierte Inhalt vonWozu dient die Golang-Lesesperre?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!