concurrent map read and map write
记录一次项目中,map因多线程冲突占用的问题
type TestMap struct { data map[int]int } func (m *TestMap) writeMap(k, v int) { if m.data == nil { m.data = make(map[int]int) } m.data[k] = v } func run() { m := &TestMap{} for i := 0; i < 1000; i++ { go m.writeMap(i, i) } }
只是打一个比方,方法差不多
这样会导致map在一个线程中写入中,另一个线程也在写入
这时需要加锁
type TestMap struct { data map[int]int Mu sync.Mutex // 加入锁 } func (m *TestMap) writeMap(k, v int) { m.Mu.Lock() // 使用锁先锁定 defer m.Mu.Unlock() // 等方法执行完解除锁 if m.data == nil { m.data = make(map[int]int) } m.data[k] = v }