[Go] 使用读写锁对map资源进行安全处理

当需要有一个全局性的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{}
}
复制代码

 

posted @   唯一客服系统开发笔记  阅读(712)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示
1
chat with us