[Go] 使用读写锁对map资源进行安全处理
2023-02-18 15:41:27 时间
当需要有一个全局性的map集合资源进行增删改数据时,需要对该map资源增加读写锁,防止并发时出现安全问题
下面的类就是举例 , 属性中的Conns模拟存储一些资源,对这些资源进行并发的增加数据,使用写锁锁住资源,当读取是使用读锁锁住资源
package snet import "sync" import "errors" type ConnManger struct { Conns map[uint32]string ConnLock sync.RWMutex } func NewConnManger() *ConnManger { cm := &ConnManger{ Conns: make(map[uint32]string), } return cm } func (cm *ConnManger) Add(id uint32, value string) { cm.ConnLock.Lock() defer cm.ConnLock.Unlock() cm.Conns[id] = value } func (cm *ConnManger) Remove(id uint32) { cm.ConnLock.Lock() defer cm.ConnLock.Unlock() delete(cm.Conns, id) } func (cm *ConnManger) Get(id uint32) (string, error) { cm.ConnLock.RLock() defer cm.ConnLock.RUnlock() conn, ok := cm.Conns[id] if !ok { return "", errors.New("connmanager get conn error ") } return conn, nil } func (cm *ConnManger) Len() int { return len(cm.Conns) } func (cm *ConnManger) Clean() { cm.ConnLock.Lock() defer cm.ConnLock.Unlock() for key, _ := range cm.Conns { delete(cm.Conns, key) } }
使用时
package main import "single/snet" import "log" import "sync" import "strconv" func main() { cm:=snet.NewConnManger() var wg sync.WaitGroup for i:=0;i<10;i++{ go func(i uint32){ defer wg.Done() wg.Add(1) cm.Add(i,"连接"+strconv.Itoa(int(i))) }(uint32(i)) } wg.Wait() log.Println(cm.Len()) for key,value:=range cm.Conns{ log.Println(key,value) } cm.Clean() log.Println(cm.Len()) select{} }
相关文章
- js 数组去除重复数据-当WPS开始像支持VBA一样支持JS语言时,微软又该何去何从?
- linux安装mysql,远程使用navicat连接
- 前端Vue和React项目 Git 管理常用.gitignore配置
- Git 使用笔记
- c/s架构开发-C#下基于C/S架构的任务管理系统——开发安装
- pthread_create 线程属性-Linux学习——线程的创建和回收
- c++实现一个堆-包含插入删除获取
- Golang编译的二进制文件在alpine中无法运行
- C++如何简单快速去除容器中的重复元素
- 让devc++使用c++11标准
- git常用指令
- 纯C++实现字符版坦克大战
- c++中类的数据成员初始化次序
- 纯C++实现字符版推箱子
- git下载子模块失败问题解决办法
- 基于Jekyll与Github Pages搭建博客
- HTML5项目笔记3:使用Canvas设计离线系统的Logo
- linux系统开mc服务器
- 红队技术-Cobaltstrike之Linux上线
- 权限维持-Linux后门