版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010986776/article/details/86307981
sync.Once概述
sync包下的Once对象可以保证某个函数在多任务并发过程中只被执行一次
var once sync.Once
once.Do(task())
案例
- 下面的案例中,我们开辟10条协程一起追杀比尔,但保证比尔只被杀死一次
- 即Kill(bill)在并发中确保只被执行一次
package main
import (
"fmt"
"sync"
"time"
)
type Person struct {
Name string
Alive bool
}
func Kill(person *Person) {
fmt.Println("杀死", person)
time.After(time.Second * 3)
person.Alive = false
fmt.Println("比尔:啊!!!")
}
func main() {
var wg sync.WaitGroup
//声明Once对象
var once sync.Once
bill := &Person{"比尔", true}
/*开辟10条协程追杀比尔*/
for i := 0; i < 10; i++ {
wg.Add(1)
go func() {
//保证Kill(bill)只执行一次
once.Do(func() {
Kill(bill)
})
wg.Done()
}()
}
wg.Wait()
fmt.Println("main over")
}
我们起了10条协程,而实际的执行效果是