Senior
O que acontecerá ao comprimento do array no final ao fazer um append concorrente de 1000 goroutines?
sobes.tech IA
Resposta da IA
При конкурентном вызове 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 или программа может упасть.