1. 程式人生 > >4.5-1 併發技術6:只執行一次

4.5-1 併發技術6:只執行一次

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條協程,而實際的執行效果是
在這裡插入圖片描述