Concurrent Map Read and Map Write

fatal error: concurrent map read and map write

Quick Answer

Multiple goroutines are reading from and writing to the same map simultaneously. Use sync.RWMutex or sync.Map to protect concurrent map access.

Why This Happens

Go maps are not safe for concurrent use. If one goroutine is writing to a map while another is reading or writing, the runtime detects this and crashes with a fatal error. Unlike data races on other types, concurrent map access is detected at runtime and causes an immediate crash.

The Problem

func main() {
    m := make(map[string]int)
    go func() {
        for i := 0; i < 1000; i++ {
            m["key"] = i
        }
    }()
    go func() {
        for i := 0; i < 1000; i++ {
            _ = m["key"]
        }
    }()
    time.Sleep(time.Second)
}

The Fix

func main() {
    var mu sync.RWMutex
    m := make(map[string]int)
    go func() {
        for i := 0; i < 1000; i++ {
            mu.Lock()
            m["key"] = i
            mu.Unlock()
        }
    }()
    go func() {
        for i := 0; i < 1000; i++ {
            mu.RLock()
            _ = m["key"]
            mu.RUnlock()
        }
    }()
    time.Sleep(time.Second)
}

Step-by-Step Fix

  1. 1

    Identify the concurrent access

    The crash output shows which goroutines are accessing the map. Find the map variable in question.

  2. 2

    Determine the access pattern

    Check if most accesses are reads with occasional writes (use RWMutex) or if you need a simpler sync.Map.

  3. 3

    Add synchronization

    Wrap all map reads with RLock/RUnlock and writes with Lock/Unlock, or replace with sync.Map.

Bugsly catches this automatically

Bugsly's AI analyzes this error pattern in real-time, explains what went wrong in plain English, and suggests the exact fix — before your users even report it.

Try Bugsly free