Mutex(互斥锁)

  • Lock()加锁,Unlock()解锁
  • 适用于读写不确定,并且只有一个读或者写的场景

例:

package main

import (
"sync"
"time"
) var (
l *sync.Mutex
i int
) func increment() {
l.Lock()
defer l.Unlock()
i++
} func main() {
l = new(sync.Mutex)
for i := 0; i < 1000; i++ {
go increment()
}
println("i=", i)
time.Sleep(time.Second)
}

RWMutex(读写锁)

  • 基于Mutex 实现,Lock()加写锁,Unlock()解写锁,RLock()加读锁,RUnlock()解读锁
  • 多个goroutine可以同时读,读锁只会阻止写;只能一个同时写,写锁会同时阻止读写
  • 适用于读多写少的场景

例:

package main

import (
"sync"
"time"
) var (
l *sync.RWMutex
i int
) func write() {
println("write start")
l.Lock()
i++
l.Unlock()
println("write end")
} func read() {
println("read start")
l.RLock()
time.Sleep(time.Millisecond * 100)
println("read end, i =", i)
l.RUnlock()
} func main() {
l = new(sync.RWMutex)
go read()
go read()
go write()
time.Sleep(time.Second)
}

以上代码中,会同时启动两个读和一个写,上述代码i的值可能会出现三种情况:

  1. (读读)写

    写锁执行在两个读锁后执行,i输出为:0, 0
  2. 读写读

    写锁在两个读锁中间执行,i输出为:0,1
  3. 写(读读)

    写锁在两个读锁之前执行,i输出为:1,1

最新文章

  1. 导出本地和远程SVN项目, Export remote SVN repository
  2. Entity Framework 中的in操作实例
  3. TestLink测试软件安装条件检查不通过的解决方案
  4. 【BZOJ 4269】再见Xor
  5. 编写一个JSP程序实现用户登录
  6. 鸟哥笔记:postfix的一些重要配置文件
  7. Netty4.x中文教程系列(四) 对象传输
  8. Ubuntu Android Studio/IntelliJ IDEA 支持文件中文命名
  9. Struts—自定义一个简单的mystruct
  10. [PR &amp; ML 5] [Introduction] Decision Theory
  11. SpringBoot实践 - SpringBoot+mysql
  12. cocoapods卸载重装 解决clone,install,search很慢的问题
  13. struts2相关简单介绍
  14. ListView原理
  15. 4.28Linux(6)
  16. 周末班:Python基础之面向对象基础
  17. systemd的新特性及unit常见类型分析与awk用法示列
  18. idea编辑器快捷键调整
  19. QT上位机
  20. linux ls统计文件个数

热门文章

  1. Asp.Net MVC Identity 2.2.1 使用技巧(四)
  2. 布隆过滤器(Bloom Filter)简要介绍
  3. JavaScript的事件的处理函数(鼠标,键盘,HTML)
  4. 【[HNOI2010]弹飞绵羊】
  5. LCTF wp简单复现
  6. 28、springboot整合RabbitMQ(2)
  7. sql连接查询INNER JOIN,LEFT JOIN,RIGHT JOIN区别
  8. 理解numpy exp函数
  9. 404 Note Found队-现场编程
  10. 如何在localStorage中存取数组