[Go] 使用读写锁对map资源进行安全处理
2024-09-01 11:50:16
当需要有一个全局性的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:=;i<;i++{
go func(i uint32){
defer wg.Done()
wg.Add()
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{}
}
最新文章
- npm 私有模块的管理使用
- node.js express 4.x 安装指南
- AJAX 请求区分 $_SERVER[&#39;HTTP_X_REQUESTED_WITH&#39;] 小解
- linux的三种安装软件包的方式(小白的学习之旅)
- debug实战:COM组件GetToSTA导致高内存+GC被阻塞
- c#利用WebClient和WebRequest获取网页源代码
- POJ2533 Longest ordered subsequence
- POJ 2728 Desert King 最优比率生成树
- DotNet友元程序集解析
- 原生js实现图片网格式渐显、渐隐效果
- 关于 JavaScript 的 null 和 undefined,判断 null 的真实类型
- 鱼刺 winhttp
- QML-开发中遇到的错误收集
- linux下rsync和tar增量备份梳理
- 通达OA2008从windows环境移植到linux部署手册
- ngnix简介以及如何实现负载均衡原理
- pigz 压缩
- 转:CRF++词性标注
- 树莓派3+rtl8812au开启monitor模式
- Python 2.7.9 Demo - 020.函数的定义、返回
热门文章
- Leetcode之广度优先搜索(BFS)专题-133. 克隆图(Clone Graph)
- Tensor Flow基础(2.0)
- 脚本自动创建ldap账号
- centos7基础安装
- HanLP-最短路径分词
- Linux下用OTL操作MySql(包含自己封装的类库及演示样例代码下载)
- 无法加载文件 C:\Program Files\nodejs\npm.ps1,因为在此系统上禁止运行脚本。
- O014、云计算与OpenStack
- 一个页面两个div(一个柱状图或者折线图一个饼图)
- ZeroMQ 三种模式python3实现