在go中sync负责提供同步原语如互斥锁等。任何属于该包类型的对象都不应该被复制(只能passed by pointer)
sync.Mutex
sync.Mutex是最常用的同步原语。其作用在于对共享资源的互斥访问。
常用的使用范式
mutex := &sync.Mutex{
}
mutex.Lock()
// Update shared variable (e.g. slice, pointer on a structure, etc.)
mutex.Unlock()
使用Lock有什么注意事项?
当调用Lock的时候,如果mutex已经被上锁,那么调用Lock的goroutine会阻塞到mutex被解锁为止。
而且mutex是不可重入锁,意味着即便是同一个goroutine,如果多次对同一把锁Lock也会触发死锁
func decThenPlus(mutex *sync.Mutex,i int){
mutex.Lock()
defer mutex.Unlock()
fmt.Println(i)
plus(mutex,i-1)