NIUCLOUD是一款SaaS管理后台框架多应用插件+云编译。上千名开发者、服务商正在积极拥抱开发者生态。欢迎开发者们免费入驻。一起助力发展! 广告
## sync.Once 这个对象适合一次写入,多次读取的操作.适合做一些初始化的操作. ~~~ func main() { once := sync.Once{} wg := new(sync.WaitGroup) for i := 0; i < 10; i++ { wg.Add(1) n := i go func() { defer wg.Done() once.Do(show) fmt.Println(n) }() } wg.Wait() } func show() { fmt.Println("show") } ~~~ 结果: ``` show 2 3 4 9 8 1 7 5 6 0 ``` 我们可以看到,在并发中,once.Do只调用了一次.当第一个协程获取到这个锁的时候,会先判断boolean变量是否为1(true),只有不为1才锁定mutex,不再需要每次都锁定mutex)。在第一次调用时,boolean变量的值是false,Do会调用loadIcons并会将boolean变量设置为true. **当这个值被调用后,其他的协程将不再执行里面的逻辑了**.