sync.Mutex为互斥锁(也叫全局锁),Lock()加锁,Unlock()解锁。
sync.WaitGroup,创建一个任务,sw.Add(1),加一;任务完成的时候使用 sw.Done() 来将任务减一;使用 sw.Wait() 来阻塞等待所有任务完成。
package main
import (
"fmt"
"sync"
)
var (
s = 0
syn = sync.Mutex{}
sw = sync.WaitGroup{}
)
func main(){
for i := 0; i < 100; i++ {
for i := 0; i < 100; i++ {
sw.Add(1)
go func() {
defer sw.Done()
syn.Lock()
s++
syn.Unlock()
}()
}
}
sw.Wait()
fmt.Println(s)
}
运行结果:
如果注释掉sync.Mutex,结果可能不正确:
package main
import (
"fmt"
"sync"
)
var (
s = 0
syn = sync.Mutex{}
sw = sync.WaitGroup{}
)
func main(){
for i := 0; i < 100; i++ {
for i := 0; i < 100; i++ {
sw.Add(1)
go func() {
defer sw.Done()
//syn.Lock()
s++
//syn.Unlock()
}()
}
}
sw.Wait()
fmt.Println(s)
}
结果: