go sync.once用法

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。

歡迎關注go語言公眾號 每日go語言 golang_everyday

 

sync.once可以控制函數只能被調用一次。不能多次重複調用。範例程式碼:

 

package main

 

import (

"fmt"

"sync"

"time"

)

 

func main() {

o := &sync.Once{}

go do(o)

go do(o)

time.Sleep(time.Second * 2)

}

 

func do(o *sync.Once) {

fmt.Println("Start do")

o.Do(func() {

fmt.Println("Doing something...")

})

fmt.Println("Do end")

}

 

輸出結果:

Start do

Doing something...

Do end

Start do

Do end

這裡 Doing something 只被調用了一次。

 

查看go once的源碼實現,也是非常的簡單:

 

type Once struct {

m Mutex

done uint32

}

 

func (o *Once) Do(f func()) {

if atomic.LoadUint32(&o.done) == 1 {

return

}

// Slow-path.

o.m.Lock()

defer o.m.Unlock()

if o.done == 0 {

defer atomic.StoreUint32(&o.done, 1)

f()

}

}

核心思想是使用原子計數記錄被執行的次數。使用Mutex Lock Unlock鎖定被執行函數,防止被重複執行。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.