您好,登錄后才能下訂單哦!
這篇文章主要介紹“sync包的作用是什么”,在日常操作中,相信很多人在sync包的作用是什么問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”sync包的作用是什么”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
sync.Once
Once 的作用是多次調用但只執行一次,Once 只有一個方法,Once.Do(),向 Do 傳入一個函數,這個函數在第一次執行 Once.Do() 的時候會被調用,以后再執行 Once.Do() 將沒有任何動作,即使傳入了其它的函數,也不會被執行,如果要執行其它函數,需要重新創建一個 Once 對象。
Once 可以安全的在多個例程中并行使用。
type Once struct { m Mutex done uint32 } // 都次調用,近執行一次方法f func (o *Once) Do(f func())
sync.Mutex
互斥鎖用來保證在任一時刻,只能有一個例程訪問某對象。
Mutex 的初始值為解鎖狀態。
Mutex 通常作為其它結構體的匿名字段使用,使該結構體具有 Lock 和 Unlock 方法。
Mutex 可以安全的在多個例程中并行使用。
// Locker 接口包裝了基本的 Lock 和 UnLock 方法,用于加鎖和解鎖。 type Locker interface { Lock() Unlock() } // Lock 用于鎖住 m,如果 m 已經被加鎖,則 Lock 將被阻塞,直到 m 被解鎖。 func (m *Mutex) Lock() // Unlock 用于解鎖 m,如果 m 未加鎖,則該操作會引發 panic。 func (m *Mutex) Unlock()
sync.RWMutex
RWMutex 比 Mutex 多了一個“讀鎖定”和“讀解鎖”,可以讓多個例程同時讀取某對象。
RWMutex 的初始值為解鎖狀態。
RWMutex 通常作為其它結構體的匿名字段使用。
Mutex 可以安全的在多個例程中并行使用。
// Lock 將 rw 設置為寫鎖定狀態,禁止其他例程讀取或寫入。 func (rw *RWMutex) Lock() // Unlock 解除 rw 的寫鎖定狀態,如果 rw 未被寫鎖定,則該操作會引發 panic。 func (rw *RWMutex) Unlock() // RLock 將 rw 設置為讀鎖定狀態,禁止其他例程寫入,但可以讀取。 func (rw *RWMutex) RLock() // Runlock 解除 rw 的讀鎖定狀態,如果 rw 未被讀鎖頂,則該操作會引發 panic。 func (rw *RWMutex) RUnlock() // RLocker 返回一個互斥鎖,將 rw.RLock 和 rw.RUnlock 封裝成了一個 Locker 接口。 func (rw *RWMutex) RLocker() Locker
sync.WaitGroup
WaitGroup 用于等待一組例程的結束。
主例程在創建每個子例程的時候先調用 Add 增加等待計數,每個子例程在結束時調用 Done 減少例程計數。
之后,主例程通過 Wait 方法開始等待,直到計數器歸零才繼續執行。
// 計數器增加 delta,delta 可以是負數。 func (wg *WaitGroup) Add(delta int) // 計數器減少 1 func (wg *WaitGroup) Done() // 等待直到計數器歸零。如果計數器小于 0,則該操作會引發 panic。 func (wg *WaitGroup) Wait()
sync.Cron
條件等待通過 Wait 讓例程等待,通過 Signal 讓一個等待的例程繼續,通過 Broadcast 讓所有等待的例程繼續。
在 Wait 之前應當手動為 c.L 上鎖,Wait 結束后手動解鎖。為避免虛假喚醒,需要將 Wait 放到一個條件判斷循環中官方要求的寫法如下:
c.L.Lock() for !condition() { c.Wait() } // 執行條件滿足之后的動作... c.L.Unlock() type Cond struct { L Locker // 在“檢查條件”或“更改條件”時 L 應該鎖定。 } // 創建一個條件等待 func NewCond(l Locker) *Cond // Broadcast 喚醒所有等待的 Wait,建議在“更改條件”時鎖定 c.L,更改完畢再解鎖。 func (c *Cond) Broadcast() // Signal 喚醒一個等待的 Wait,建議在“更改條件”時鎖定 c.L,更改完畢再解鎖。 func (c *Cond) Signal() // Wait 會解鎖 c.L 并進入等待狀態,在被喚醒時,會重新鎖定 c.L func (c *Cond) Wait()
到此,關于“sync包的作用是什么”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。