sync包测试代码
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) }