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)
}

 

posted @ 2022-04-28 18:33  fchy822  阅读(29)  评论(0编辑  收藏  举报