多线程同步
- 互斥锁
- 互斥锁的本质是当一个 goroutine 访问的时候, 其它 goroutine 都不能访问。
- 这样就能实现资源同步, 但是在避免资源竞争的同时也降低了程序的并发性能. 程序由原来的并发执行变成了串行。
- 案例:
- 有一个打印函数, 用于逐个打印字符串中的字符, 有两个人都开启了 goroutine 去打印。
- 如果没有添加互斥锁, 那么两个人都有机会输出自己的内容。
- 如果添加了互斥锁, 那么会先输出某一个的, 输出完毕之后再输出另外一个人的。
package main
import (
"fmt"
"sync"
"time"
)
// 创建一把互斥锁
var lock sync.Mutex
func printer(str string) {
// 让先来的人拿到锁, 把当前函数锁住, 其它人都无法执行
// 上厕所关门
lock.Lock()
for _, v := range str {
fmt.Printf("%c", v)
time.Sleep(time.Millisecond * 500)
}
// 先来的人执行完毕之后, 把锁释放掉, 让其它人可以继续使用当前函数
// 上厕所开门
lock.Unlock()
}
func person1() {
printer("hello")
}
func person2() {
printer("world")
}
func main() {
go person1()
go person2()
for {
}
}
go 语言多线程学习笔记——互斥锁go 线程锁浅 see_you 的博客-CSDN 博客 (opens new window)