fmt.Println("Taking first read lock lock") mux.RLock() fmt.Println("took first read lock lock") go func(){ fmt.Println("Taking write lock") mux.Lock() fmt.Println("took write lock") mux.Unlock() }() time.Sleep(1*time.Second) mux.RUnlock() time.Sleep(1*time.Second) fmt.Println("Taking second read lock lock") mux.RLock() fmt.Println("took second read lock lock") mux.RUnlock()