I am trying to build a map. Normally all read can be done in parallel, except when a write comes, than all reads need to be locked. I thought I understood how Mutex work in go but clearly I do not.
I first tried to use a RWMutex write lock:
type person struct {
sync.RWMutex
age int
}
func main() {
a := person{age: 3}
fmt.Println(a.age)
go func() {
a.Lock()
time.Sleep(5 * time.Second)
a.age = 4
fmt.Println(a.age)
a.Unlock()
}()
fmt.Println(a.age)
fmt.Println("main", a.age)
time.Sleep(20 * time.Second)
}
I somewhat expected that the wrote lock would lock the read operation a.age. Instead I got:
3
3
main 3
4
So I decided to add also a read lock:
func main() {
a := person{age: 3}
fmt.Println(a.age)
go func() {
a.Lock()
a.RLock()
time.Sleep(5 * time.Second)
a.age = 4
fmt.Println(a.age)
a.Unlock()
a.RUnlock()
}()
fmt.Println(a.age)
fmt.Println("main", a.age)
time.Sleep(20 * time.Second)
}
Even worse, I got:
3
3
main 3
Clearly I am not understanding how this works. Thanks for any help.