Sobes.tech
Back to questions
Senior
3

Как синхронизировать доступ нескольких горутин к общему объекту в куче?

Companies where asked
Магнит Тех

Answer from AI

sobes.tech AI

Для синхронизации доступа нескольких горутин к общему объекту в Go обычно используют механизмы из пакета sync:

  • Mutex (sync.Mutex) — блокирует доступ к ресурсу, позволяя одной горутине работать с объектом, пока другие ждут.
  • RWMutex (sync.RWMutex) — позволяет нескольким горутинам читать объект одновременно, но блокирует запись, если кто-то пишет.

Пример с использованием sync.Mutex:

import (
    "sync"
)

type SafeCounter struct {
    mu sync.Mutex
    count int
}

func (c *SafeCounter) Inc() {
    c.mu.Lock()
    defer c.mu.Unlock()
    c.count++
}

func (c *SafeCounter) Value() int {
    c.mu.Lock()
    defer c.mu.Unlock()
    return c.count
}

Таким образом, перед доступом к общему объекту горутина блокирует мьютекс, а после завершения работы — разблокирует. Это предотвращает гонки данных и обеспечивает корректную работу с общими данными.