Senior
Milyen problémák merülnek fel a konkurens hozzáférés során, amikor a Get és Set metódusokat különböző gorutinokból hívják? Hogyan oldják meg ezeket?
sobes.tech MI
Válasz az MI-től
Amikor a Get és Set metódusokat egyszerre hívják különböző gorutinokból, adatverseny (data race) probléma lép fel. Ez azért történik, mert több gorutin olvashatja és módosíthatja ugyanazokat az adatokat egyszerre, ami kiszámíthatatlan viselkedéshez és hibákhoz vezet.
Ennek a problémának a megoldására Go-ban általában a következőket használják:
- Mutex (sync.Mutex) — lezárja az adatokhoz való hozzáférést a művelet idejére, kizárólagos hozzáférést biztosítva.
- RWMutex (sync.RWMutex) — lehetővé teszi több goroutine számára az adatok egyidejű olvasását, de blokkolja az írást, ha valaki ír.
- Csatornák (channels) — az adatok szekvenciális hozzáférésének szervezésére üzenetküldésen keresztül.
Példa RWMutex-szel:
import "sync"
type SafeMap struct {
mu sync.RWMutex
data map[string]string
}
func (m *SafeMap) Get(key string) (string, bool) {
m.mu.RLock() // olvasási zárolás
defer m.mu.RUnlock()
val, ok := m.data[key]
return val, ok
}
func (m *SafeMap) Set(key, value string) {
m.mu.Lock() // írási zárolás
defer m.mu.Unlock()
m.data[key] = value
}
Ez a megközelítés biztosítja, hogy az adatok ne sérüljenek meg párhuzamos hozzáférés során.