Sobes.tech
Back to questions
Senior
6

Что будет в конце с длиной массива при конкурентном append из 1000 горутин?

Companies where asked
OZONOZON

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 или программа может упасть.