Sobes.tech
Middle

Go'da harita (map) ile çalışırken güvenliği sağlamak için hangi mutexleri kullanıyorsunuz?

sobes.tech yapay zeka

AI'dan gelen yanıt

Veri yapılarıyla, özellikle de haritalar (map) ile eşzamanlı erişim güvenliğini sağlamak için Go'da sync paketinden mutexler kullanılır.

  • sync.Mutex: Temel bir mutex, karşılıklı dışlama sağlar. Bir harita üzerinde okuma veya yazma işlemi yapılırken kod bölümlerini kilitlemek ve serbest bırakmak için kullanılır.
  • sync.RWMutex: Paylaşılan (okuma) ve münhasır (yazma) erişim sağlayan mutex. Birden fazla goroutine'un aynı anda haritadan okuma yapmasına izin verir, ancak yalnızca bir tanesi yazabilir. Okuma işlemlerinin yazma işlemlerine göre çok daha fazla olduğu senaryolar için idealdir.

Eşzamanlı ve güvenli harita işlemleri için tercih edilen seçenek sync.RWMutex'dir, çünkü çoklu okuma işlemlerinde daha iyi performans sağlar.

sync.RWMutex kullanımı örneği:

import (
	"sync"
)

type SafeMap struct {
	mu sync.RWMutex
	m  map[string]int
}

func NewSafeMap() *SafeMap {
	return &SafeMap{
		m: make(map[string]int),
	}
}

func (sm *SafeMap) Set(key string, value int) {
	sm.mu.Lock()   // Yazma için kilitleme
	defer sm.mu.Unlock()
	sm.m[key] = value
}

func (sm *SafeMap) Get(key string) (int, bool) {
	sm.mu.RLock()  // Okuma için kilitleme
	defer sm.mu.RUnlock()
	value, ok := sm.m[key]
	return value, ok
}

Ayrıca, çoğu durumda açık kilitleme olmadan eşzamanlı kullanım için optimize edilmiş sync.Map adlı özel bir tip de vardır, ancak belirli sınırlamaları ve farklı bir API'yi içerir. Ancak, daha esnek kilit kontrolü veya özel erişim senaryoları gerekiyorsa, standart map üzerinde sync.RWMutex kullanımı yaygın bir uygulamadır.