[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:=;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{}
}
[Go] 使用读写锁对map资源进行安全处理的更多相关文章
- 深刨显式锁ReentrantLock原理及其与内置锁的区别,以及读写锁ReentrantReadWriteLock使用场景
		
13.显示锁 在Java5.0之前,在协调对共享对象的访问时可以使用的机制只有synchronized和volatile.Java5.0增加了一种新的机制:ReentrantLock.与之前提到过的机 ...
 - 用读写锁三句代码解决多线程并发写入文件 z
		
C#使用读写锁三句代码简单解决多线程并发写入文件时提示“文件正在由另一进程使用,因此该进程无法访问此文件”的问题 在开发程序的过程中,难免少不了写入错误日志这个关键功能.实现这个功能,可以选择使用第三 ...
 - C#使用读写锁三行代码简单解决多线程并发写入文件时线程同步的问题
		
(补充:初始化FileStream时使用包含文件共享属性(System.IO.FileShare)的构造函数比使用自定义线程锁更为安全和高效,更多内容可点击参阅) 在开发程序的过程中,难免少不了写入错 ...
 - 读者写者问题继 读写锁SRWLock
		
在<秒杀多线程第十一篇读者写者问题>文章中我们使用事件和一个记录读者个数的变量来解决读者写者问题.问题虽然得到了解决,但代码有点复杂.本篇将介绍一种新方法--读写锁SRWLock来解决这一 ...
 - pthread_rwlock_t读写锁函数说明
		
读写锁 索引: 初始化一个读写锁pthread_rwlock_init 读锁定读写锁 pthread_rwlock_rdlock 非阻塞读锁定 pthread_rwlock_tryrdloc ...
 - Linux程序设计学习笔记----多线程编程线程同步机制之相互排斥量(锁)与读写锁
		
相互排斥锁通信机制 基本原理 相互排斥锁以排他方式防止共享数据被并发訪问,相互排斥锁是一个二元变量,状态为开(0)和关(1),将某个共享资源与某个相互排斥锁逻辑上绑定之后,对该资源的訪问操作例如以下: ...
 - 多线程面试题系列(14):读者写者问题继 读写锁SRWLock
		
在第十一篇文章中我们使用事件和一个记录读者个数的变量来解决读者写者问题.问题虽然得到了解决,但代码有点复杂.本篇将介绍一种新方法--读写锁SRWLock来解决这一问题.读写锁在对资源进行保护的同时,还 ...
 - C# 防止同时调用=========使用读写锁三行代码简单解决多线程并发的问题
		
http://www.jb51.net/article/99718.htm 本文主要介绍了C#使用读写锁三行代码简单解决多线程并发写入文件时提示"文件正在由另一进程使用,因此该进程无 ...
 - UNIX环境高级编程——线程同步之读写锁以及属性
		
读写锁和互斥量(互斥锁)很类似,是另一种线程同步机制,但不属于POSIX标准,可以用来同步同一进程中的各个线程.当然如果一个读写锁存放在多个进程共享的某个内存区中,那么还可以用来进行进程间的同步, 互 ...
 
随机推荐
- filter_var()函数
			
我们使用 payload :?url=javascript://comment%250aalert(1) ,可以执行 alert 函数: 实际上,这里的 // 在JavaScript中表示单行注释,所 ...
 - Spring @Import注解 —— 导入资源
			
在应用中,有时没有把某个类注入到IOC容器中,但在运用的时候需要获取该类对应的bean,此时就需要用到@Import注解.示例如下: 先创建两个类,不用注解注入到IOC容器中,在应用的时候在导入到当前 ...
 - ipcs查看消息队列命令
			
修改消息队列大小: root:用户: /etc/sysctl.conf kernel.msgmnb =4203520 #kernel.msgmnb =3520 kernel.msgmni = 2878 ...
 - unzip 命令
			
NAME unzip - list, test and extract compressed files in a ZIP archive SYNOPSIS unzip [-Z] [-cflptTuv ...
 - 2019牛客暑期多校训练营(第三场)- H Magic Line (计算几何)
			
题目链接:https://ac.nowcoder.com/acm/contest/883/H 题意:给定n个点(n为偶数),求一条直线使得n个点平均分散在直线两端,即每端n/2个点. 思路:把n个点按 ...
 - Employee Free Time
			
We are given a list schedule of employees, which represents the working time for each employee. Each ...
 - Test:河北金力集团企业网集成
			
三.网站建设部分(40分) 河北金力集团公文流转系统 1.项目需求: 河北金力集团是我省机械加工的龙头企业,主要从事矿山机械制造及各种机械零部件加工.企业有3个厂区,主厂区位于省高新技术开发区,3个分 ...
 - linux 三剑客之awk总结
			
AWK 1.begin end使用 cat /tmp/passwd |awk -F ':' 'BEGIN {print "hello"} {print $1"\t&quo ...
 - Linux(17):Shell编程(4)
			
案例1:批量生成随机字 符 文件名案例 使用for 循环在 /neo 目录下批量创建10个html文件,其中每个文件需要包含10个随机小写字母加固定字符串 neo创建的结果名称示例 如下: [root ...
 - 如何使用sftp下载Linux服务器上的文件到本地
			
下载Linux服务器上的文件到本地 Linux服务器上的操作 sftp xxxxx@jumper.xxxx.com 使用put命令进行文件上传,put app.log 本地操作 sftp xxxxx@ ...