Как стать автором
Поиск
Написать публикацию
Обновить

Комментарии 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

Зарегистрируйтесь на Хабре, чтобы оставить комментарий