golang Map与sync.Map

小麦客 · · 2589 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

内置的map

package main

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

var map_obj = make(map[string]int) // 应对高并发时不安全

// 定义设置map数据类型的方法
func set(key string, val int)  {
    map_obj[key] = val
}

// 定义读取map数据类型的方法
func get(key string) int  {
    return map_obj[key]
}

func main() {
    //map_obj := make(map[string]int, 6)
    //map_obj["name"] = 666

    //var map_obj  map[string]int
    //fmt.Printf("%#v", map_obj) // map[string]int(nil)

    //var map_obj sync.Map
    //map_obj.Store("name","xiaomaike")
    //val, _ := map_obj.Load("name")
    //fmt.Println(val)

    var wg sync.WaitGroup

    for i := 0; i< 200; i++ {
        wg.Add(1)
        go func(n int){
            defer wg.Done()
            key :=strconv.Itoa(n)
            set(key, n)
            fmt.Println(key, get(key))
        }(i)
    }

    wg.Wait()
}

增强版map(sync.Map)

package main

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


func main() {
    map_obj := sync.Map{} // sync.Map{} 内置并发版
    wg := sync.WaitGroup{}

    for i := 0; i< 2000; i++ {
        wg.Add(1)
        go func(n int){
            defer wg.Done()
            key :=strconv.Itoa(n)
            map_obj.Store(key, n)  // Store() => sync.Map设置map类型的方法
            read, _:= map_obj.Load(key) // Load => sync.Map 读取map类型的方法
            fmt.Println(key, read)
        }(i)
    }

    wg.Wait()
}

使用互斥锁实现的增强版map

package main

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

var map_obj = make(map[string]int)

// 定义设置map数据类型的方法
func set(key string, val int)  {
    map_obj[key] = val
}

// 定义读取map数据类型的方法
func get(key string) int  {
    return map_obj[key]
}

func main() {
    //map_obj := make(map[string]int, 6)
    //map_obj["name"] = 666

    //var map_obj  map[string]int
    //fmt.Printf("%#v", map_obj) // map[string]int(nil)

    //var map_obj sync.Map
    //map_obj.Store("name","xiaomaike")
    //val, _ := map_obj.Load("name")
    //fmt.Println(val)

    var wg sync.WaitGroup
    var lock sync.Mutex // 定义一把锁对象

    for i := 0; i< 2000; i++ {
        wg.Add(1)
        go func(n int){
            defer wg.Done()
            key :=strconv.Itoa(n)

            lock.Lock() // 加入互斥锁操作,保证 map 应对高并发时的不安全性
            set(key, n)
            lock.Unlock()

            fmt.Println(key, get(key))
        }(i)
    }

    wg.Wait()
}


有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:小麦客

查看原文:golang Map与sync.Map

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

2589 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传