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();
更多內容請關注每日編程,每天進步一點。
閱讀更多 每日編程 的文章