声明:文中文字大部分为原创,图片来源于网络,无任何侵权/盗取目的,如有请找我删除进行维权。
并发控制,同步原语 sync 包
1.1 竞态
资源竞争,就是在程序中,同一块内存同时被多个 goroutine 访问。我们使用 go build、go run、go test 命令时,添加 -race 标识可以检查代码中是否存在资源竞争。
解决这个问题,我们可以给资源进行加锁,让其在同一时刻只能被一个协程来操作。
- sync.Mutex(互斥锁)
- sync.RWMutex(读写锁)
1.2 逃逸分析
逃逸分析:就是程序运行时内存的分配位置(栈或堆),是由编译器来确定的。堆适合不可预知大小的内存分配。但是为此付出的代价是分配速度较慢,而且会形成内存碎片。
1.2.1 go的逃逸场景有哪些?
- 指针逃逸
- 栈空间不足逃逸
- 动态类型逃逸
- 闭包引用对象逃逸