ENIGMA AI
ENIGMA AI
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 — невидимый ИИ-помощник для технических интервью

Попробовать бесплатно
Все вопросы