type Stat struct {
counters map[string]*int64
countersLock sync.RWMutex
averages map[string]*int64
averagesLock sync.RWMutex
}
Он называется ниже
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
}
}
Я понимаю, что мы сначала блокируем приемник s (который является типом Stat), а затем добавляем к нему, если счетчик существует.
Вопросы:
Q1: зачем нам блокировать его? Что означает RWMutex
?
Q2: s.countersLock.RLock()
- блокирует ли он весь приемник s или только поле счетчиков в типе Stat?
Q3: s.countersLock.RLock()
- блокирует ли это поле средних?
Q4: Почему мы должны использовать RWMutex
? Я думал, что канал был предпочтительным способом обработки concurrency в Голанге?
Q5: Что это за atomic.AddInt64
. Почему в этом случае нам нужен атомный?
Q6: Почему мы должны разблокировать право до того, как мы добавим к нему?