Go sync.Map

需求

读写共享map

 

#1 常规map

package main

import (
    "fmt"
    "strconv"
    "sync"
)


func _110Test1() {
    wg := sync.WaitGroup{}
    mp := make(map[string]int)
    for i := 0; i < 20; i++ {
        wg.Add(1)
        go func(n int) {
            key := strconv.Itoa(n)
            mp[key] = n
            value, ok := mp[key]
            fmt.Println("key:%v, value:%v, ok:%v", key, value, ok)
            wg.Done()
        }(i)
    }
    wg.Wait()
}

func main() {
    _110Test1()
}

执行:

fatal error: concurrent map writes

问题:内置的map不是并发安全的,要为map加锁来保证并发的安全性了

 

#2开箱即用包:sync.Map()

特点:开箱即用且并发安全

package main

import (
    "fmt"
    "strconv"
    "sync"
)

var m = sync.Map{}

func _110Test2() {
    wg := sync.WaitGroup{}
    for i := 0; i < 20; i++ {
        wg.Add(1)
        go func(n int) {
            key := strconv.Itoa(n)
            m.Store(key, n)
            value, ok := m.Load(key)
            fmt.Printf("key:%v, value:%v, ok:%v\n", key, value, ok)
            wg.Done()
        }(i)
    }
    wg.Wait()
}

func main() {
    _110Test2()
}

执行:

key:19, value:19, ok:true
key:0, value:0, ok:true
key:14, value:14, ok:true
key:16, value:16, ok:true
key:17, value:17, ok:true
key:18, value:18, ok:true
key:2, value:2, ok:true
key:1, value:1, ok:true
key:11, value:11, ok:true
key:15, value:15, ok:true
key:3, value:3, ok:true
key:10, value:10, ok:true
key:12, value:12, ok:true
key:5, value:5, ok:true
key:13, value:13, ok:true
key:6, value:6, ok:true
key:9, value:9, ok:true
key:7, value:7, ok:true
key:8, value:8, ok:true
key:4, value:4, ok:true

 

posted @ 2022-02-09 09:52  jihite  阅读(43)  评论(0编辑  收藏  举报