多线程同步问题
优质
小牛编辑
152浏览
2023-12-01
互斥锁
- 互斥锁的本质是当一个 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{
;
}
}