1. 互斥锁
先看个例子
func main(){
fmt.Println("start study golang...... ")
// 1.声明互斥锁
var mutex sync.Mutex
count:=0;
for r:=0;r<20 ;r++ {
go func() {
mutex.Lock()
count+=1;
defer mutex.Unlock();
}()
time.Sleep(time.Second)
fmt.Println("the count is : ", count)
}
}
每个资源都对应于一个可称为 “互斥锁” 的标记,这个标记用来保证在任意时刻,只能有一个协程(线程)访问该资源。其它的协程只能等待。
互斥锁是传统并发编程对共享资源进行访问控制的主要手段,它由标准库sync中的Mutex结构体类型表示。sync.Mutex类型只有两个公开的指针方法,Lock和Unlock。Lock锁定当前的共享资源,Unlock进行解锁。
在使用互斥锁时,一定要注意:对资源操作完成后,一定要解锁,否则会出现流程执行异常,死锁等问题。通常借助defer。锁定后,立即使用defer语句保证互斥锁及时解锁。如下所示:
var mutex sync.Mutex // 定义互斥锁变量 mutex<