go map sync RWMutex

go map类似python字典
map是引用类型因此使用的时候需要先定义,比如用make 开辟一段空间。

map并发读写是存在问题的,就是我正在读的元素可能正在被修改那抹我读的就是错的,因此在map读写的时候需要加锁。
不加锁报错

package main

import (
	"fmt"
	"sync"
)

var Mutex sync.Mutex

var Map = make(map[string]int, 20)

func writeMap() {
	for i := 0; i < 500; i++ {
		key := fmt.Sprintf("stu_%d", i)
		Map[key] = i
	}
}

func readMap() {
	for i := 0; i < 50; i++ {
		key := fmt.Sprintf("stu_%d", i)
		v, ok := Map[key]
		if ok {
			fmt.Printf("key : %s value: %d", key, v)
		} else {
			fmt.Println("nopt exist")
		}
	}
}

func main() {
	fmt.Println("test")
	go readMap()
	go writeMap()
	for {
	}
}

报错如下:
fatal error: concurrent map read and map write

修改如下通过读写锁,读锁之间可以并行,但是写锁不能并行写,读与写互斥

package main

import (
	"fmt"
	"sync"
)

var Mutex sync.RWMutex

var Map = make(map[string]int, 20)

func writeMap() {
	
	for i := 0; i < 10; i++ {
	Mutex.Lock()
		key := fmt.Sprintf("stu_%d", i)
		Map[key] = i
	Mutex.Unlock()
	}

}

func readMap(id int) {
	
	for i := 0; i < 5; i++ {
		Mutex.RLock()
		key := fmt.Sprintf("stu_%d", i)
		v, ok := Map[key]
		if ok {
			fmt.Printf("thread 为  %d 读取到 key : %s value: %d\n", id, key, v)
		} else {
			fmt.Println("not exist\n")
		}
		Mutex.RUnlock()
	}
	
}

func main() {
	fmt.Println("test")
	go writeMap()
	go readMap(1)
	go readMap(2)
	go readMap(3)
	for {
	}
}

打印结果如下

thread 为  3 读取到 key : stu_0 value: 0
thread 为  3 读取到 key : stu_1 value: 1
thread 为  3 读取到 key : stu_2 value: 2
thread 为  3 读取到 key : stu_3 value: 3
thread 为  3 读取到 key : stu_4 value: 4
thread 为  1 读取到 key : stu_0 value: 0
thread 为  2 读取到 key : stu_0 value: 0
thread 为  2 读取到 key : stu_1 value: 1
thread 为  2 读取到 key : stu_2 value: 2
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值