tgoop.com/go_interview_lib/462
Create:
Last Update:
Last Update:
💬 Нужно ли лочить структуру мьютексом, если идет конкурентная запись в разные поля структуры?
В Go структура данных не является автоматически потокобезопасной. Даже если мы записываем в разные поля структуры из разных горутин, могут возникнуть проблемы с синхронизацией, такие как race conditions.
Основная причина использования мьютексов или других механизмов синхронизации заключается в том, чтобы обеспечить атомарность операций и предотвратить непредсказуемое поведение, которое может возникнуть из-за конкурентного доступа к данным.
Рассмотрим пример структуры с двумя полями, которые обновляются конкурентно:
package main
import (
"fmt"
"sync"
)
type Data struct {
Field1 int
Field2 int
mu sync.Mutex
}
func main() {
d := &Data{}
var wg sync.WaitGroup
// Запись в Field1
wg.Add(1)
go func() {
defer wg.Done()
for i := 0; i < 1000; i++ {
d.mu.Lock()
d.Field1 = i
d.mu.Unlock()
}
}()
// Запись в Field2
wg.Add(1)
go func() {
defer wg.Done()
for i := 0; i < 1000; i++ {
d.mu.Lock()
d.Field2 = i
d.mu.Unlock()
}
}()
wg.Wait()
fmt.Println("Field1:", d.Field1)
fmt.Println("Field2:", d.Field2)
}
1. Мы используем мьютекс (
d.mu.Lock()
и d.mu.Unlock()
) для защиты записи в структуру Data
. Даже если запись происходит в разные поля структуры, мьютекс гарантирует, что только одна горутина имеет доступ к структуре в любой момент времени.2. Использование мьютекса предотвращает гонки данных и гарантирует корректное обновление полей структуры.
Если известно, что запись в разные поля не приведет к гонкам данных (например, поля абсолютно независимы и нет побочных эффектов), можно обойтись без мьютекса. Однако это решение требует глубокого понимания контекста и потенциальных рисков.
BY Библиотека Go для собеса | вопросы с собеседований
Share with your friend now:
tgoop.com/go_interview_lib/462