Назад к вопросам
Junior — Middle
84
Каким образом устраняется конкуренция за данные при параллельной работе с горутинами в языке Go?
Ответ от нейросети
sobes.tech AI
В Go конкуренция за данные при параллельной работе горутин устраняется с помощью нескольких механизмов:
- Мьютексы (sync.Mutex) — позволяют блокировать доступ к общим данным, чтобы в каждый момент времени только одна горутина могла их изменять.
var mu sync.Mutex
var counter int
func increment() {
mu.Lock()
defer mu.Unlock()
counter++
}
- Каналы (channels) — позволяют передавать данные между горутинами безопасно без явной блокировки, реализуя модель CSP (Communicating Sequential Processes).
ch := make(chan int)
func worker() {
val := <-ch // получение данных
// обработка val
}
func main() {
go worker()
ch <- 42 // отправка данных
}
- Пакет sync/atomic — для атомарных операций с переменными (например, инкремент счетчика) без блокировок.
Таким образом, Go предлагает как низкоуровневые примитивы синхронизации, так и высокоуровневые каналы для безопасной работы с общими данными в параллельных горутинах.