Golang sync包的7件法寶

Golang sync包的7件法寶

sync.WaitGroup

var g sync.WaitGroup

g.Add(1) //每創建一個goroutine,就把任務隊列中任務的數量+1

g.Done() //任務完成,將任務隊列中的任務數量-1,其實.Done就是.Add(-1)

g.Wait() //Wait()這裡會發生阻塞,直到隊列中所有的任務結束就會解除阻塞

sync.Mutex

mutex := sync.Mutex{};

mutex.Lock();

defer mutex.Unlock();

多個線程同時運行,獲得Mutex鎖者線程優先執行,其餘線程阻塞等待

sync.RWMutex

rwMutex := sync.RWMutex{};

rwMutex.RLock();

defer rwMutex.RUnlock();

或者

rwMutex.Lock();

defer rwMutex.Unlock();

寫請求在讀鎖和寫鎖時都必須阻塞等待,讀請求只在寫鎖時阻塞等待

sync.Cond

Cond:條件變量

條件等待通過 Wait 讓協程等待,通過 Signal 讓一個等待的協程繼續,通過 Broadcast 讓所有等待的協程繼續。

在 Wait 之前應當手動為 c.L 上鎖,Wait 結束後手動解鎖。為避免虛假喚醒,需要將 Wait 放到一個條件判斷循環中。

func NewCond(l Locker) *Cond

func (c *Cond) Broadcast()

func (c *Cond) Signal()

func (c *Cond) Wait()

sync.Once

once := sync.Once{};

只執行一次以後不再觸發

once.Do(func() {

fmt.Println("Do once : ", idx); //這裡只執行一次

})

sync.Map

sync.Map線程安全的map

syncMap.LoadOrStore()//如果沒有則保存起來

syncMap.Load(idx);

sync.Pool

sync.Pool 線程安全對象池

p := &sync.Pool

p.Put(idx);

val := p.Get();

更多內容請關注每日編程,每天進步一點。


分享到:


相關文章: