1.sync.Mutex的初始化注意事项

type MemProvider struct {
lock     *sync.Mutex              //用来锁
sessions map[string]*SessionStore //用来存储在内存
}

初始化时

var lockm *sync.Mutex = new(sync.Mutex)
var memProvider = &MemProvider{sessions: make(map[string](*SessionStore)), lock: lockm}

2.sync.Mutex的嵌套调用注意事项

func (per *MemProvider) SessionInit(sid string) (Session, error) {
per.lock.Lock()
defer per.lock.Unlock()
v := make(map[interface{}]interface{})
fmt.Println("provider init session")
newSess := &SessionStore{sid: sid, timeAccessed: time.Now(), values: v}
per.sessions[sid] = newSess
fmt.Println("provider init finish")
return newSess, nil
}
func (per *MemProvider) SessionRead(sid string) (Session, error) {
per.lock.Lock()
defer per.lock.Unlock()
if sess, ok := per.sessions[sid]; ok {
return sess, nil
} else {
sess, err := per.SessionInit(sid)
return sess, err
}
return nil, nil
}

在SessionRead(sid string)函数中,

当出现per.sessions[sid]中不存在sess时,此时会执行sess.err:= per.SessionInit(sid)函数

在SessionInit(sid string)函数中,首行就出现

per.lock.Lock()
defer per.lock.Unlock()

这就需要per.lock此时属于被释放状态,而在SessionRead(sid string)中调用per.SessionInit(sid)时,此时上一步执行的lock仍然处于lock状态

改进后的代码如下

func (per *MemProvider) SessionInit(sid string) (Session, error) {
per.lock.Lock()
defer per.lock.Unlock()
v := make(map[interface{}]interface{})
newSess := &SessionStore{sid: sid, timeAccessed: time.Now(), values: v}
per.sessions[sid] = newSess
return newSess, nil
}
func (per *MemProvider) SessionRead(sid string) (Session, error) {
per.lock.Lock()
if sess, ok := per.sessions[sid]; ok {
per.lock.Unlock()
return sess, nil
} else {
per.lock.Unlock()
sess, err := per.SessionInit(sid)
return sess, err
}
per.lock.Unlock()
return nil, nil
}

此时,锁问题解决。

对于sync.Mutex使用注意事项相关推荐

  1. Go 学习笔记(66)— Go 并发同步原语(sync.Mutex、sync.RWMutex、sync.Once)

    1. 竞态条件 一旦数据被多个线程共享,那么就很可能会产生争用和冲突的情况.这种情况也被称为竞态条件(race condition),这往往会破坏共享数据的一致性. 举个例子,同时有多个线程连续向同一 ...

  2. Go sync.Mutex互斥锁的学习

    1. 前言 1.1 基础回顾 原子操作:指那些不能够被打断的操作被称为原子操作,当有一个CPU在访问这块内容addr时,其他CPU就不能访问. CAS:比较及交换,其实也属于原子操作,但它是非阻塞的, ...

  3. Go 学习笔记(23)— 并发(02)[竞争,锁资源,原子函数sync/atomic、互斥锁sync.Mutex]

    本文参考 <Go 语言实战> 1. 竞争状态简述 如果两个或者多个 goroutine 在没有互相同步的情况下,访问某个共享的资源,并试图同时读和写这个资源,就处于相互竞争的状态,这种情况 ...

  4. golang sync.Mutex 互斥锁 使用实例

    实例: var mutex sync.Mutex //互斥锁 func printer(str string){mutex.Lock() //加锁defer mutex.Unlock() //解锁fo ...

  5. Go的sync.Mutex(七):互斥锁锁定一个资源 只有一个协程操作其他等待

    简介 多个协程会操作一个特定资源,就会出现意想不到的错误类比脏读幻读等,所以我们使用互斥锁, 一个协程使用特定资源的时候进行锁定,用完解锁, 再让其他协程使用,所以其他协程想使用此资源,必须自己给资源 ...

  6. Golang sync.Mutex 与 sync.RWMutex

    文章目录 1.sync.Mutex 2.sync.RWMutex 2.1 Lock()与Unlock() 2.2 RLock() 和 RUnlock() 2.3 错误使用异常 参考文献 Golang ...

  7. go sync.Mutex

    并发编程中,不免涉及到共享资源的操作,go也提供简易的互斥锁作为访问控制的手段sync.Mutex,通过简单的Lock()进行加锁,Unlock()进行释放. 接下来我们从源码入手,看看加锁和解锁到底 ...

  8. sync.Mutex 与 sync.WaitGroup 使用示例

    使用 sync.Mutex 与 sync.WaitGroup 线程不安全的用法: {var wg sync.WaitGroupcount := 0for i := 0; i < 10; i++ ...

  9. go vet 报错:xx_xx passes lock by value: sync.Map contains sync.Mutex; call of xx_xx copies lock value

    问题描述: test.go: package main import "fmt" import "sync"var syncMapTest sync.Mapfu ...

最新文章

  1. 批量下载文献中的参考文献
  2. C#学习笔记(八)——定义类的成员
  3. 【原创】分享一些机器学习和深度学习的学习资料
  4. To Java程序员:切勿用普通for循环遍历LinkedList
  5. 的引用_java中的强引用,软引用,弱引用,虚引用
  6. uniformRowHeights属性
  7. warning C4828问题的处理
  8. 在线教育与计算机网络的融合发展,[浅谈线上教育和线下教育的融合]
  9. 管理感悟:技术好的人都有点工作狂
  10. 怎么测试软件的自动升级,欧姆龙编程软件怎么升级 自动更新步骤详解
  11. oracle 亿级数据迁移,Oracle12c迁移-某风险报告类系统升级暨迁移至12c-3
  12. 斯蒂夫·乔布斯《你必须要找到你所爱的东西》
  13. 港大HKU邮箱(connect.hku.hk)添加至iphone 自带邮箱方法
  14. 【考研资料】计算机/软件各个大学的考研初试复试资料!附考研群!一直更新...
  15. python两个等于号是代表什么_python两个等于号是什么意思_等于号表示什么意思...
  16. 闰年的判断(python)
  17. Linux下各压缩方式测试(压缩率和使用时间)
  18. btcd交易流程之交易的创建(一)
  19. matlab可以拟合分段函数吗,如何用matlab拟合出分段函数
  20. 宝马将机器架上微软 Azure,国内科技巨头也难抵汽车“诱惑”

热门文章

  1. 水母智能联合蚂蚁森林、犀牛智造等,用AI助力非遗出圈,39万人开工得“福”
  2. 0.7秒完成动漫线稿上色,爱奇艺发布AI上色引擎
  3. 无需训练RNN或生成模型,我写了一个AI来讲故事
  4. 如何用Neo4j和Scikit-Learn做机器学习任务?| 附超详细分步教程
  5. NLP这两年:15个预训练模型对比分析与剖析
  6. Python 3.8即将发布,这几个变化你必须知道
  7. Hinton等人最新研究:大幅提升模型准确率,标签平滑技术到底怎么用?
  8. 春招来袭!程序员如何拿下硅谷顶级公司200万年薪?
  9. AI开发难?请收下华为云AI大拿秘籍一份!
  10. AI一分钟 | 传阿里暂停在美扩张云业务;Google发布AI工具以识别儿童性侵犯图片...