Go
Средний
Какие инструменты синхронизации существуют в Go?
Инструменты синхронизации в Go
1. Channels (Каналы)
// Основной механизм коммуникации
ch := make(chan int) // Небуферизованный
ch := make(chan int, 10) // Буферизованный
// Отправка и получение
ch <- value // Отправить
value := <-ch // Получить
// Закрытие
close(ch)
2. sync.Mutex
var mu sync.Mutex
var counter int
func increment() {
mu.Lock()
defer mu.Unlock()
counter++
}
3. sync.RWMutex
var rwmu sync.RWMutex
var data map[string]int
func read(key string) int {
rwmu.RLock() // Много читателей
defer rwmu.RUnlock()
return data[key]
}
func write(key string, val int) {
rwmu.Lock() // Один писатель
defer rwmu.Unlock()
data[key] = val
}
4. sync.WaitGroup
var wg sync.WaitGroup
for i := 0; i < 10; i++ {
wg.Add(1)
go func(n int) {
defer wg.Done()
process(n)
}(i)
}
wg.Wait() // Ждём все горутины
5. sync.Once
var once sync.Once
var instance *Database
func GetDB() *Database {
once.Do(func() {
instance = connectToDatabase()
})
return instance
}
6. sync.Cond
var mu sync.Mutex
cond := sync.NewCond(&mu)
// Ожидание условия
cond.L.Lock()
for !condition {
cond.Wait()
}
cond.L.Unlock()
// Сигнал
cond.Signal() // Одному
cond.Broadcast() // Всем
7. sync/atomic
var counter int64
atomic.AddInt64(&counter, 1)
atomic.LoadInt64(&counter)
atomic.StoreInt64(&counter, 0)
atomic.CompareAndSwapInt64(&counter, old, new)
8. context.Context
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
select {
case result := <-doWork(ctx):
return result
case <-ctx.Done():
return ctx.Err()
}
Выбор инструмента:
| Задача | Инструмент |
|---|---|
| Передача данных | Channel |
| Защита общего состояния | Mutex |
| Много чтений, мало записей | RWMutex |
| Ожидание горутин | WaitGroup |
| Однократная инициализация | Once |
| Атомарные операции | atomic |
| Отмена и таймауты | Context |
Похожие вопросы
Готовитесь к собеседованию?
ENIGMA AI — невидимый ИИ-помощник для технических интервью
Попробовать бесплатно