type Stat struct {
counters map[string]*int64
countersLock sync.RWMutex
averages map[string]*int64
averagesLock sync.RWMutex
}
Il est appelé ci-dessous
func (s *Stat) Count(name string) {
s.countersLock.RLock()
counter := s.counters[name]
s.countersLock.RUnlock()
if counter != nil {
atomic.AddInt64(counter, int64(1))
return
}
}
Ma compréhension est que nous verrouillons d'abord le receveur s (qui est de type Stat) et ensuite nous ajoutons si le compteur existe.
Questions :
Q1: pourquoi avons-nous besoin de le verrouiller ? Que signifie RWMutex
?
Q2: s.countersLock.RLock()
- cela verrouille-t-il l'ensemble du receveur s ou seulement le champ counters dans le type Stat ?
Q3: s.countersLock.RLock()
- cela verrouille-t-il le champ averages ?
Q4: Pourquoi devrions-nous utiliser RWMutex
? Je pensais que le canal était la méthode préférée pour gérer la concurrence en Golang ?
Q5: Qu'est-ce que ce atomic.AddInt64
? Pourquoi avons-nous besoin d'atomic dans ce cas ?
Q6: Pourquoi devrions-nous déverrouiller juste avant d'ajouter ?