Skip to content

Go - sync.Map #57

Open
Open
@Petelin

Description

@Petelin

Go - sync.Map

include #56

为什么说map或者slice是线程不安全的?

因为他们内部时间不能保证各个函数是原子操作,并发执行时不能保证函数执行的正确性。
比如

func appendValue(i int) {
	// mu.Lock()
	// defer mu.Unlock()
	s = append(s, i)
	m[strconv.Itoa(i)] = i
	wg.Done()
}

func main() {
	for i := 0; i < 10000; i++ { // 10000个协程同时添加切片
		wg.Add(1)
		go appendValue(i)
	}
	wg.Wait()

	fmt.Println(len(s))
	fmt.Println(len(m))
}

最后的slice里面没有1w个元素,而map根本不允许这样操作,直接报错
fatal error: concurrent map writes

sync.Map 和 map的区别

sync.Map 不是 map + mutex. 大多数时候应该用自己定义的map+mutex或者其他同步机制。
一下两种场景可以使用sync.Map:

  1. 读远远多于写和删
  2. 不同goroutine, read,write,overwrite的是不想交的keys

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions