时间:2021-05-22
背景
go中map数据结构不是线程安全的,即多个goroutine同时操作一个map,则会报错,因此go1.9之后诞生了sync.Map
sync.Map思路来自java的ConcurrentHashMap
接口
sync.map就是1.9版本带的线程安全map,主要有如下几种方法:
Load(key interface{}) (value interface{}, ok bool)//通过提供一个键key,查找对应的值value,如果不存在,则返回nil。ok的结果表示是否在map中找到值Store(key, value interface{})//这个相当于是写map(更新或新增),第一个参数是key,第二个参数是valueLoadOrStore(key, value interface{}) (actual interface{}, loaded bool)//通过提供一个键key,查找对应的值value,如果存在返回键的现有值,否则存储并返回给定的值,如果是读取则返回true,如果是存储返回falseDelete(key interface{})//通过提供一个键key,删除键对应的值Range(f func(key, value interface{}) bool)//循环读取map中的值。//因为for ... range map是内置的语言特性,所以没有办法使用for range遍历sync.Map, 但是可以使用它的Range方法,通过回调的方式遍实践
package mainimport ( "fmt" "sync")var num = 0var addTest *AddTestfunc init() { addTest = &AddTest{}}type AddTest struct { m sync.Mutex}func (at *AddTest) increment(wg *sync.WaitGroup) { //互斥锁 at.m.Lock() //当有线程进去进行加锁 num++ at.m.Unlock() //出来后解锁,其他线程才可以进去 wg.Done()}func (at *AddTest) decrement(wg *sync.WaitGroup) { //互斥锁 at.m.Lock() //当有线程进去进行加锁 num-- at.m.Unlock() //出来后解锁,其他线程才可以进去 wg.Done()}var w sync.WaitGroupvar aa map[int]intfunc main() { var bb sync.Map var wg sync.WaitGroup //aa = make(map[int]int) wg.Add(2) go func() { //wg.Add(1) for i:=0 ;i <100; i++{ //aa[i] = i+1 //fmt.Println("a") bb.Store(i, i+1) } wg.Done() }() go func() { for i:=0 ;i <100; i++{ //aa[i] = i+1 //fmt.Println("a") bb.Store(i, i+1) } wg.Done() }() wg.Wait() bb.Range(func(k, v interface{}) bool { fmt.Println("iterate:", k, v) return true }}总结
到此这篇关于golang中使用sync.Map的文章就介绍到这了,更多相关golang中使用sync.Map内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
golang语言协程协程中使用全局变量、局部变量、指针、map、切片等作为参数时需要注意,此变量的值变化问题。与for循环,搭配使用更需谨慎。1、内置函数时直接
1.方法概述map()方法返回一个由原数组中的每个元素调用一个指定方法后的返回值组成的新数组。2.例子2.1在字符串中使用map在一个String上使用map方
针对Golang1.9的sync.RWMutex进行分析,与Golang1.10基本一样除了将panic改为了throw之外其他的都一样。RWMutex是读写互
使用map实现单词转换的实例分析从map中查找单词时必须使用find函数,不能使用下表,因为在map中使用下标访问不存在的元素将导致在map容器中添加一个新的元
问题描述:两个go程轮流打印一个切片。Golang实现:使用两个channel,只用来判断packagemainimport("fmt""sync")//两个g