Back to questions
OZON
Senior
6
Что будет в конце с длиной массива при конкурентном append из 1000 горутин?
Companies where asked
Answer from AI
sobes.tech AI
При конкурентном вызове append к одному и тому же срезу из 1000 горутин без синхронизации (например, без мьютекса) поведение будет неопределённым. В итоге длина массива может быть меньше ожидаемой, так как операции записи будут конфликтовать, перезаписывать друг друга или приводить к панике.
append не является атомарной операцией и включает в себя чтение длины, запись элемента и обновление длины. При одновременном доступе без блокировок возможны гонки данных.
Для корректного добавления элементов из нескольких горутин нужно использовать синхронизацию, например, sync.Mutex или канал.
Пример с mutex:
var mu sync.Mutex
var slice []int
wg := sync.WaitGroup{}
for i := 0; i < 1000; i++ {
wg.Add(1)
go func(val int) {
defer wg.Done()
mu.Lock()
slice = append(slice, val)
mu.Unlock()
}(i)
}
wg.Wait()
fmt.Println(len(slice)) // будет 1000
Без мьютекса длина может быть меньше 1000 или программа может упасть.