Go中map默认不安全的,也实现了并发安全的对象:
// 创建一个 sync.Map 对象 var m sync.Map // 存储数据 m.Store("key1", "value1") m.Store("key2", "value1") // 加载数据 //if value, ok := m.Load("key1"); ok { // fmt.Println(value) //} m.Load("key2") // 删除数据 //m.Delete("key1") // 遍历哈希表 m.Range(func(key, value interface{}) bool { fmt.Println(key, value) return true }) //key1 value1 //key2 value1
不安全是因为源码中没有实现读写锁。进行了判断异常:
在哈希表写操作时,会将哈希表的标志位
hashWriting
设置为 1,以表明当前正在执行写操作。当其他协程执行哈希表的读操作时,会根据当前的标志位判断是否能够执行读操作,如果标志位为hashWriting
,则说明当前正在执行写操作,就会抛出concurrent map read and map write
的异常,提示读写并发冲突。
if h.flags&hashWriting != 0 { fatal("concurrent map read and map write") }