Вопрос проверяет понимание механизма RWMutex в Go и правил совместного доступа к данным при конкурентном чтении и записи.
RWMutex (sync.RWMutex) — это примитив синхронизации, который позволяет нескольким горутинам одновременно читать данные, но только одной горутине — писать. Это повышает производительность в сценариях, где чтение происходит часто, а запись — редко.
package main
import (
"fmt"
"sync"
"time"
)
func main() {
var mu sync.RWMutex
data := 0
// Горутина-писатель
go func() {
mu.Lock()
fmt.Println("Писатель: захватил write lock")
time.Sleep(2 * time.Second)
data = 42
mu.Unlock()
fmt.Println("Писатель: отпустил write lock")
}()
time.Sleep(100 * time.Millisecond) // даём писателю старт
// Горутина-читатель
go func() {
mu.RLock()
fmt.Println("Читатель: захватил read lock, data =", data)
mu.RUnlock()
}()
time.Sleep(3 * time.Second)
}В этом примере читатель будет ждать, пока писатель не отпустит write lock. Если бы первой захватила read lock горутина-читатель, писатель ждал бы её завершения.
RWMutex полезен, когда данные часто читаются и редко изменяются. Он позволяет избежать блокировки читателей друг другом, но гарантирует, что запись не произойдёт одновременно с чтением, предотвращая состояние гонки.