sync
是 Go 语言标准库中提供的用于同步、并发控制的包,其中包含了一些常用的同步工具,例如:互斥锁(Mutex)、读写锁(RWMutex)、条件变量(Cond)等。
互斥锁(Mutex)
互斥锁(Mutex)是 sync
包中最常用的同步机制,可以用来保护临界区,避免多个 goroutine 同时访问造成的竞争条件(Race Condition)。互斥锁有两个状态:锁定(Locked)和未锁定(Unlocked)。一旦锁定,其它 goroutine 将无法获取锁,只有当锁被释放后,其它 goroutine 才能获取锁并进入临界区。
互斥锁提供了两个主要的方法:Lock()
和 Unlock()
。Lock()
方法会将互斥锁置为锁定状态,如果互斥锁已经被锁定,则会阻塞当前 goroutine 直到锁被释放。Unlock()
方法用于释放锁,如果互斥锁当前未被锁定,则会引发 panic。
下面是一个互斥锁的示例代码:
代码语言:javascript复制package main
import (
"fmt"
"sync"
)
var count int
var mutex sync.Mutex
func increment() {
mutex.Lock()
defer mutex.Unlock()
count
}
func main() {
var wg sync.WaitGroup
for i := 0; i < 1000; i {
wg.Add(1)
go func() {
defer wg.Done()
increment()
}()
}
wg.Wait()
fmt.Println(count)
}
在上面的示例代码中,我们定义了一个 count
变量和一个互斥锁 mutex
。increment()
函数用于对 count
进行加一操作,并且在操作完成后立即释放互斥锁,避免锁被一直占用而导致其它 goroutine 无法进入临界区。在 main()
函数中,我们启动了 1000 个 goroutine 并发地执行 increment()
函数,最终输出 count
的值。由于互斥锁的保护,程序的输出结果总是 1000。