golang 中的map为什么说是非线程安全的

2,695 阅读1分钟

golang的map 跟hash map 是一样的,但是go的分配过程又有自己独特的方式。可找下golang map 原理的文章看下。但是为什么说map 是非线程安全的呢?

因为hash map 的内存是按照2的倍数开辟的,当前面开辟的内存不够的时候,会新开辟一段内存,将原来内存的数据转移到新的内存块中,这个过程是没有加锁的,如果这个时候同时有个读的线程过来获取这块内存数据,就会出现安全问题。

所以多个goroutine同时操作map的时候可能会出现concurrent map writes 的问题,自己实现一个加好读写锁的map结构,建议直接用golang 的sync.Map。性能好,同时简单易用。