이는 여러 고루틴이 동일한 맵을 놓고 경쟁하기 때문입니다. 이 문제를 해결하는 방법에는 두 가지가 있습니다. 하나는 sync.Map을 사용하는 것이고, 다른 하나는 잠그는 것입니다. sync.map은 go1.9에 추가된 새로운 기능이므로 지금은 여기서 논의하지 않습니다. 게다가 현재 비즈니스 시나리오는 읽기-쓰기 잠금으로 완전히 해결할 수 있으므로 읽기-쓰기 잠금을 사용하기로 결정했습니다.
읽기-쓰기 잠금
RWMutex는 읽기-쓰기 잠금입니다. 여러 개의 읽기 잠금 또는 하나의 쓰기 잠금은 읽기 수가 쓰기 수보다 훨씬 많은 시나리오에서 자주 사용됩니다. (추천 학습: go)
func (rw *RWMutex) Lock() 쓰기 잠금, 쓰기 잠금을 추가하기 전에 다른 읽기 잠금과 쓰기 잠금이 있는 경우, 그런 다음 잠금은 최종적으로 잠금을 사용할 수 있을 때까지 차단됩니다. 차단된 Lock 호출은 획득한 잠금에서 새 판독기를 제외합니다. 즉, 쓰기 잠금 권한이 읽기 잠금보다 높고 우선순위가 부여됩니다. 쓰기 잠금 해제
func (rw *RWMutex) Unlock() 쓰기 잠금 해제, 쓰기 잠금이 수행되지 않으면 런타임 오류가 발생합니다
# 🎜🎜## 🎜🎜#func (rw *RWMutex) RLock() 쓰기 잠금이 있는 경우 읽기 잠금을 로드할 수 없습니다. 읽기 잠금만 있거나 잠금이 없는 경우 읽기 잠금을 로드할 수 있습니다. 여러 읽기 잠금을 로드할 수 있으므로 "더 많이 읽고 적게 쓰기" 시나리오에 적합합니다.func(rw *RWMutex) RUnlock() RUnlock은 읽기 잠금을 해제합니다. 단일 RLock 호출은 동시에 존재하는 다른 리더에는 적용되지 않습니다. 읽기를 위해 rw가 잠겨 있지 않은 경우 RUnlock을 호출하면 런타임 오류가 발생합니다. Lock
모든 읽기 잠금이 해제될 때까지 읽기 잠금이 쓰기 잠금을 차단해야 합니다
쓰기 잠금이 필요합니다. 모든 쓰기 잠금이 해제될 때까지 읽기 잠금을 차단합니다#🎜🎜 #쓰기 잠금은 쓰기 잠금을 차단해야 합니다
코드:
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() //解除读锁 加锁和解锁必须成对出现,并且建议放在同一层次的代码块中
위 내용은 golang 읽기 잠금의 용도는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!