Go的sync.Mutex(七):互斥锁锁定一个资源 只有一个协程操作其他等待
生活随笔
收集整理的這篇文章主要介紹了
Go的sync.Mutex(七):互斥锁锁定一个资源 只有一个协程操作其他等待
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
簡介
多個協(xié)程會操作一個特定資源,就會出現(xiàn)意想不到的錯誤類比臟讀幻讀等,所以我們使用互斥鎖,
一個協(xié)程使用特定資源的時候進(jìn)行鎖定,用完解鎖,
再讓其他協(xié)程使用,所以其他協(xié)程想使用此資源,必須自己給資源解鎖或等待正在使用的協(xié)程解鎖
在代碼中就是鎖定一段代碼,代碼里面有資源。
注意
- 在一個 goroutine 獲得 Mutex 后,其他 goroutine 只能等到這個 goroutine 釋放該 Mutex
- 使用 Lock() 加鎖后,不能再繼續(xù)對其加鎖,直到利用 Unlock() 解鎖后才能再加鎖
- 在 Lock() 之前使用 Unlock() 會導(dǎo)致 panic 異常
- 已經(jīng)鎖定的 Mutex 并不與特定的 goroutine 相關(guān)聯(lián),這樣可以利用一個 goroutine 對其加鎖,再利用其他 goroutine 對其解鎖
- 在同一個 goroutine 中的 Mutex 解鎖之前再次進(jìn)行加鎖,會導(dǎo)致死鎖
- 適用于讀寫不確定,并且只有一個讀或者寫的場景
參考
https://www.cnblogs.com/shockerli/p/golang-pkg-mutex.html
代碼
package mainimport ("fmt""sync""time" )func ccc(i int)(){mutex.Lock()fmt.Println("Lock:", i)time.Sleep(time.Second)fmt.Println("Unlock:", i)mutex.Unlock()defer wait.Done() } var mutex sync.Mutex var wait = sync.WaitGroup{}func main() {fmt.Println("互斥鎖")mutex.Lock()for i := 1; i <= 3; i++ {wait.Add(1)go ccc(i)}mutex.Unlock()wait.Wait() }// 互斥鎖鎖定一個資源 // 其他的協(xié)程無法進(jìn)行操作此段的資源 其他的協(xié)程都選擇等待此段鎖代碼的結(jié)束 // 這個資源已經(jīng)被當(dāng)前的協(xié)程進(jìn)行鎖定,其他的協(xié)程也要操作此資源的都要等待 // 鎖是表明一段代碼中只能同步執(zhí)行的 // 互斥鎖 // Lock: 1 // Unlock: 1 // Lock: 3 // Unlock: 3 // Lock: 2 // Unlock: 2?
總結(jié)
以上是生活随笔為你收集整理的Go的sync.Mutex(七):互斥锁锁定一个资源 只有一个协程操作其他等待的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 刷短视频杀时间 中老年人竟然更爱刷短视
- 下一篇: 工行etc有什么优惠