Комментарии 2
Когда
miss > len(dirty)
Тут небольшое уточнение - когда miss >= len(dirty), если судить по исходникам:
func (m *Map) missLocked() {
m.misses++
if m.misses < len(m.dirty) {
return
}
m.read.Store(&readOnly{m: m.dirty})
m.dirty = nil
m.misses = 0
}
И начиная, кажется, с 1.19 - read стал atomic.Pointer[readOnly]
вместо atomic.Value
.
Потому что авторы го как обычно сунули костыль вместо нормального решения. Новички приходят, видят структуру Map в пакете sync и делают логичный вывод, что в случае если нужна потокобезопасная мера, нужно юзать её, не писать же свои велосипеды с нуля.
В нормальных языках реализация типа ConcurrentMap из статьи была бы внутри стандартной библиотеки, а синк мапа называлась бы sync.MostReadMap или как угодно ещё, но не тупо sync.Map
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Почему sync.Map — почти всегда плохая идея