package main
import "fmt"
import "sync"
import "sync/atomic"
//可以用来写单例模式和一些初始化工作等
var once sync.Once
//父线程调用Add方法来设定应等待的线程的数量。
//每个被等待的线程在结束时应调用Done方法。
//同时,主线程里可以调用Wait方法阻塞至所有线程结束
var wg sync.WaitGroup
//var s sync.Mutex
func add(i *int32) {
for j := 0; j < 10000; j++ {
//s.Lock()
//*i = *i + 1
//s.Unlock()
atomic.AddInt32(i,1) //原子加法,等价于上面 lock的操作
}
}
func main() {
onceBody := func() {
fmt.Println("Only once")
}
var count int32 = 0
for i := 0; i < 10; i++ {
wg.Add(1)
go func() {
defer wg.Done()
once.Do(onceBody) //只执行一次
add(&count)
}()
}
wg.Wait()
fmt.Println(count)
}