1. 程式人生 > 其它 >Go語言併發程式設計_同步Sync

Go語言併發程式設計_同步Sync

技術標籤:Go基礎併發程式設計golang

Go語言中對於同步任務的使用主要是通過Sync包下的物件進行實現。Sync包位於src/sync。其包下有常使用的鎖,waitGroup,原子型別資料等。
在這裡插入圖片描述

sync.WaitGroup

Go語言中除了鎖還可以使用sync.WaitGroup來實現併發任務的同步。

sync.WaitGroup的解釋:A WaitGroup waits for a collection of goroutines to finish.
The main goroutine calls Add to set the number of goroutines to wait for. Then each of the goroutines runs and calls Done when finished. At the same time, Wait can be used to block until all goroutines have finished.

從上面的解釋中,可以知道sync.WaitGroup主要使用的方法有Add,Done,Wait.。在sync.WaitGroup中還有一個state()方法,可以用於
state返回wg儲存在state和sema欄位的指標工作狀態。
上面的話同時也描述了sync.WaitGroup的工作流程:

  1. sync.WaitGroup內部維護了一個計數器,計數器的值可以增加或者減少。而計數器的值也代表了我們啟動了多少個併發任務。
  2. 在main goroutine中使用Add函式新增需要併發的任務數量,Add(N)就會新增N個任務,計數器的值+N
  3. 每個任務完成時需要呼叫Done函式,計數器的值將會-1
  4. 通過Wait來等待併發任務執行完成,當計數器為0時,表示所有的併發任務已經完成。
  5. 程式碼例項
func add()  {
	for i:=0;i<5000;i++{
		lock.Lock()//加鎖
		x = x+1
		lock.Unlock()//解鎖
	}
	wg.Done()
}
func main() {
	wg.Add(3)
	go add()
	go add()
	go add()
	wg.Wait()
	fmt.Println(x)
}
  • Add()方法
(wg *WaitGroup) Add(delta int) 

主要功能:計數器+delta

// Add adds delta, which may be negative, to the WaitGroup counter.
// If the counter becomes zero, all goroutines blocked on Wait are released. // If the counter goes negative, Add panics. //
  1. add方法中可以使用負數
  2. 如果計數器變為0,所有阻塞在Wait方法的goroutine將會被釋放。而當計數器變為負數,Add方法將會報錯。
  • Done()方法
func (wg *WaitGroup) Done() 

主要功能:計數器-1
原始碼如下:

func (wg *WaitGroup) Done() {
	wg.Add(-1)
}
  • Wait()方法
(wg *WaitGroup) Wait()

主要功能:阻塞goroutine直到計數器變為0

sync.Once

sync.Once位於src/sync包下,用於在高併發的場景下只執行一次的場景。
其主要有2個方法Do(),doSlow()
sync.Once內部包含一個互斥鎖和一個布林值,互斥鎖保證布林值和資料的安全,而布林值用來記錄初始化是否完成。這樣設計就能保證初始化操作的時候是併發安全的並且初始化操作也不會被執行多次。