加入收藏 | 设为首页 | 会员中心 | 我要投稿 北几岛 (https://www.beijidao.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2021-05-21 06:47:35 所属栏目:大数据 来源: https://www.jb51.cc
导读:当需要有一个全局性的map集合资源进行增删改数据时,需要对该map资源增加读写锁,防止并发时出现安全问题 下面的类就是举例 , 属性中的Conns模拟存储一些资源,对这些资源进行并发的增加数据,使用写锁锁住资源,当读取是使用读锁锁住资源 package snetimpo

当需要有一个全局性的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]),}
    return cm
}
func (cm *ConnManger) Add(id uint32,value ) {
    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,)
}
func (cm *ConnManger) Get(id uint32) (,error) {
    cm.ConnLock.RLock()
    defer cm.ConnLock.RUnlock()
    conn,ok := cm.Conns[]
    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/snetlogstrconv
func main()  {
    cm:=snet.NewConnManger()
    var wg .WaitGroup
    for i:=0;i<10;i++{
        go func(i uint32){
            defer wg.Done()
            wg.Add(1)
            cm.Add(i,连接"+strconv.Itoa((i)))
        }(uint32(i))
    }
    wg.Wait()
    log.Println(cm.Len())
    range cm.Conns{
        log.Println(key,value)
    }
    cm.Clean()
    log.Println(cm.Len())
    select{}
}

?

(编辑:北几岛)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读