4.5-1 并发技术6:只执行一次

版权声明:本文为博主原创文章,未经博主允许不得转载。 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条协程,而实际的执行效果是
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/u010986776/article/details/86307981