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

最新文章

  1. npm 私有模块的管理使用
  2. node.js express 4.x 安装指南
  3. AJAX 请求区分 $_SERVER[&#39;HTTP_X_REQUESTED_WITH&#39;] 小解
  4. linux的三种安装软件包的方式(小白的学习之旅)
  5. debug实战:COM组件GetToSTA导致高内存+GC被阻塞
  6. c#利用WebClient和WebRequest获取网页源代码
  7. POJ2533 Longest ordered subsequence
  8. POJ 2728 Desert King 最优比率生成树
  9. DotNet友元程序集解析
  10. 原生js实现图片网格式渐显、渐隐效果
  11. 关于 JavaScript 的 null 和 undefined,判断 null 的真实类型
  12. 鱼刺 winhttp
  13. QML-开发中遇到的错误收集
  14. linux下rsync和tar增量备份梳理
  15. 通达OA2008从windows环境移植到linux部署手册
  16. ngnix简介以及如何实现负载均衡原理
  17. pigz 压缩
  18. 转:CRF++词性标注
  19. 树莓派3+rtl8812au开启monitor模式
  20. Python 2.7.9 Demo - 020.函数的定义、返回

热门文章

  1. Leetcode之广度优先搜索(BFS)专题-133. 克隆图(Clone Graph)
  2. Tensor Flow基础(2.0)
  3. 脚本自动创建ldap账号
  4. centos7基础安装
  5. HanLP-最短路径分词
  6. Linux下用OTL操作MySql(包含自己封装的类库及演示样例代码下载)
  7. 无法加载文件 C:\Program Files\nodejs\npm.ps1,因为在此系统上禁止运行脚本。
  8. O014、云计算与OpenStack
  9. 一个页面两个div(一个柱状图或者折线图一个饼图)
  10. ZeroMQ 三种模式python3实现