sync.RWMutex
- Go kursu
- Orta seviye
- Ders 20/80
- 4 dk
Okuma-yazma mutex'ini ve RLock/RUnlock öğrenirsin.
sync.RWMutex
Okumaların yazmalardan çok daha sık olduğu durumlarda sync.RWMutex kullanılır. Birden çok okuyucu aynı anda RLock tutabilir; yazıcı Lock aldığında hem okuyucular hem diğer yazıcılar bekler.
type Onbellek struct {
mu sync.RWMutex
m map[string]string
}
func (o *Onbellek) Al(k string) (string, bool) {
o.mu.RLock()
defer o.mu.RUnlock()
v, ok := o.m[k]
return v, ok
}Map ve eşzamanlılık
Go map'leri eşzamanlı yazmaya karşı güvenli değildir; aynı anda okuma ve yazma fatal error: concurrent map read and map write ile programı çökertir. Seçenekler: map'i RWMutex ile korumak ya da çok goroutine'li, anahtarları seyrek değişen durumlar için sync.Map kullanmak. Çoğu durumda RWMutex daha anlaşılır ve hızlıdır.
Uygulama Güvenli önbellek
Onbellek türünü sync.RWMutex ve map[string]string ile yaz. Koy(k, v string) Lock, Al(k string) string RLock kullansın. "dil" = "go" koyup okuyarak yazdır.
Başlangıç kodu
package main
import (
"fmt"
"sync"
)
func main() {
// buraya yaz
}Örnek çözüm
package main
import (
"fmt"
"sync"
)
type Onbellek struct {
mu sync.RWMutex
m map[string]string
}
func (o *Onbellek) Koy(k, v string) {
o.mu.Lock()
defer o.mu.Unlock()
if o.m == nil {
o.m = map[string]string{}
}
o.m[k] = v
}
func (o *Onbellek) Al(k string) string {
o.mu.RLock()
defer o.mu.RUnlock()
return o.m[k]
}
func main() {
var o Onbellek
o.Koy("dil", "go")
fmt.Println(o.Al("dil"))
}Beklenen çıktı
go
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 Bir goroutine yazmak için <code>Lock</code> beklerken yeni <code>RLock</code> istekleri ne olur?
- Lock iptal edilir
- Bekletilir; yazıcı aç kalmasın diye Doğru cevap
- Hemen alınır
- Panic üretir
Açıklama: Go'nun RWMutex'i bekleyen bir yazıcı varsa yeni okuyucuları durdurur; aksi halde sürekli okuma yazıcıyı sonsuza dek bekletirdi.
2 Okuma kilidi
o.mu.____()
defer o.mu.RUnlock()
return o.m[k]
o.mu.RLock()
defer o.mu.RUnlock()
return o.m[k]
Açıklama: RLock birden çok okuyucunun aynı anda girmesine izin verir.
3 Yöntem ve kullanım
| Kavram | Anlamı |
|---|---|
RLock / RUnlock |
Okuma |
Lock / Unlock |
Yazma |
sync.Map |
Seyrek değişen anahtarlar |
Korumasız map |
Eşzamanlı yazmada çöker |