CodeBlanks Logo Icon CodeBlanks

sync.RWMutex

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

main.go
package main

import (
    "fmt"
    "sync"
)

func main() {
    // buraya yaz
}

Örnek çözüm

main.go
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

Soru
o.mu.____()
defer o.mu.RUnlock()
return o.m[k]
Cevap
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

Orta seviye bölümündeki tüm dersler