RW Mutex ile normal bir mutex arasındaki fark nedir?
sobes.tech yapay zeka
AI'dan gelen yanıt
sync.RWMutex, aynı anda birden fazla goroutine'un verileri okumasına izin verir, ancak sadece bir goroutine verileri yazabilir. sync.Mutex, başka bir goroutine'in kilidi almasını engeller (okuma veya yazma olsun) ilk goroutine kilidi serbest bırakana kadar.
-
sync.Mutex: Özel kilit. Kilitli veya değil. Aynı anda sadece bir goroutine mutex'i tutabilir. Sık veya benzer sürede okuma ve yazma işlemleri yapılıyorsa uygundur.// Mutex kullanım örneği var mu sync.Mutex var counter int func increment() { mu.Lock() counter++ mu.Unlock() } -
sync.RWMutex: Okuma ve yazma için kilit. Aynı anda birden fazla goroutine'un okuma yapmasına izin verir, ancak yazma kilidi özeldir. Yazma kilidi tutan bir goroutine, diğer yazma ve okuma işlemlerini engeller. Okuma kilidi tutan goroutines, yazma işlemlerini engeller, diğer okuma işlemlerini engellemez. Okuma işlemleri yazma işlemlerinden çok daha sık gerçekleşiyorsa uygundur.// RWMutex kullanım örneği var rwmu sync.RWMutex var data map[string]string = make(map[string]string) func readData(key string) string { rwmu.RLock() // Okuma kilidi alınır value := data[key] rwmu.RUnlock() // Okuma kilidi serbest bırakılır return value } func writeData(key, value string) { rwmu.Lock() // Yazma kilidi alınır data[key] = value rwmu.Unlock() // Yazma kilidi serbest bırakılır }
Ana farklar aşağıdaki tabloda özetlenebilir:
| Özellik | sync.Mutex |
sync.RWMutex |
|---|---|---|
| Kilit tipi | Özel (okuma/yazma) | Paylaşılan (okuma) + özel (yazma) |
| Aynı anda erişim | Bir goroutine | Birden fazla goroutine okuma yapabilir, bir tane yazma yapabilir |
| Okuma kilidi yöntemi | Lock() |
RLock() |
| Yazma kilidi yöntemi | Lock() |
Lock() |
| Okuma kilidi serbest bırakma | Unlock() |
RUnlock() |
| Yazma kilidi serbest bırakma | Unlock() |
Unlock() |
| Performans | Daha basit, sık okuma durumunda yavaş olabilir | Daha karmaşık, sık okuma ve nadir yazma durumlarında daha hızlı olabilir |