 Map 来解决 map 的并发操作问题
Map 来解决 map 的并发操作问题
  文章目录: [TOC]
# 前言
在 Golang 中 map 不是并发安全的,自 1.9 才引入了 sync.Map ,sync.Map 的引入确实解决了 map 的并发安全问题,不过 sync.Map 却没有实现 len() 函数,如果想要计算 sync.Map 的长度,稍微有点麻烦,需要使用 Range 函数。
# map 并发操作出现问题
func main() {
	demo := make(map[int]int)
	go func() {
		for j := 0; j < 1000; j++ {
			demo[j] = j
		}
	}()
	go func() {
		for j := 0; j < 1000; j++ {
			fmt.Println(demo[j])
		}
	}()
	time.Sleep(time.Second * 1)
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
执行输出:
fatal error: concurrent map read and map write
1
# sync.Map 解决并发操作问题
func main() {
	demo := sync.Map{}
	go func() {
		for j := 0; j < 1000; j++ {
			demo.Store(j, j)
		}
	}()
	go func() {
		for j := 0; j < 1000; j++ {
			fmt.Println(demo.Load(j))
		}
	}()
	time.Sleep(time.Second * 1)
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
执行输出:
<nil> false
1 true
...
999 true
1
2
3
4
5
6
2
3
4
5
6
# 计算 map 长度
func main() {
	demo := make(map[int]int)
	for j := 0; j < 1000; j++ {
		demo[j] = j
	}
	fmt.Println("len of demo:", len(demo))
}
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
执行输出:
len of demo: 1000
1
# 计算 sync.Map 长度
func main() {
	demo := sync.Map{}
	
	for j := 0; j < 1000; j++ {
		demo.Store(j, j)
	}
	lens := 0
	demo.Range(func(key, value interface{}) bool {
		lens++
		return true
	})
	fmt.Println("len of demo:", lens)
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
执行输出:
len of demo: 1000
1
# 小结
- Load加载 key 数据
- Store更新或新增 key 数据
- Delete删除 key 数据
- Range遍历数据
- LoadOrStore如果存在 key 数据则返回,反之则设置
- LoadAndDelete如果存在 key 数据则删除
以上,希望对你能够有所帮助。
# 推荐阅读
编辑  (opens new window)
  