您好,登錄后才能下訂單哦!
這篇“Go讀寫鎖操作的方法”文章的知識點大部分人都不太理解,所以小編給大家總結了以下內容,內容詳細,步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“Go讀寫鎖操作的方法”文章吧。
方法一: RLock 這個方法是讀鎖,當寫鎖存在的時候,無法加載讀鎖,只有當不存在鎖,或者只有讀鎖的時候才能使用。讀鎖可以同時加載多個,適用于多度寫少的場景。
方法二: RUnlock 這個方法是讀解鎖,用來撤銷單次的讀鎖操作。
方法三: Lock 這個方法是寫上鎖,如果在添加寫上鎖之前已經有其他的讀鎖和寫鎖了,此時,這個Lock會被阻塞,直到可以使用。
方法四: Unlock 這個方法是寫解鎖,如果沒有綁定寫鎖就直接寫解鎖,會引發運行時錯誤。
下面用實際的代碼做例子,看一下讀操作:
package main import ( "fmt" "sync" "time" ) //新建一個鎖對象的指針,然后待會兒再指針中創建這個鎖的對象 var rwMutex *sync.RWMutex //為了保證 子的goroutine先執行,可以使用同步等待組wg,這里創建wg的指針類型 var wg *sync.WaitGroup func main() { rwMutex = new(sync.RWMutex) wg = new(sync.WaitGroup) wg.Add(2)//這里記得+add // 在主函數中 啟動2條goroutine go readData(1) go readData(2) wg.Wait() fmt.Println("main func end") } func readData(i int) { defer wg.Done() fmt.Println(i, "start locking!") // 給讀操作 上鎖 rwMutex.RLock() // 讀數據 fmt.Println(i, "Reading data") // 睡一下 time.Sleep(1 * time.Second) // 讀解鎖 rwMutex.RUnlock() //打印提示信息 fmt.Println(i, "Read over") }
代碼運行結果如下:
2 start locking!
2 Reading data
1 start locking!
1 Reading data
2 Read over
1 Read over
main func end
從打印結果可知,第二條goroutine先上讀鎖,然后第二條開始讀取,然后第一條上讀鎖【從這里就可以看出,因為第二條的讀鎖還沒讀解鎖,第一條的讀鎖就上了,所以這里的讀鎖并不互斥】,之后第一條開始讀取,第二條讀解鎖,第一條讀解鎖。主goroutine結束。
package main import ( "fmt" "sync" "time" ) //新建一個鎖對象的指針,然后待會兒再指針中創建這個鎖的對象 var rwMutex *sync.RWMutex //為了保證 子的goroutine先執行,可以使用同步等待組wg,這里創建wg的指針類型 var wg *sync.WaitGroup func main() { rwMutex = new(sync.RWMutex) wg = new(sync.WaitGroup) wg.Add(4) // 在主函數中 啟動2條goroutine go readData(1) go readData(2) go writeData(3) go writeData(4) wg.Wait() fmt.Println("main func end") } func readData(i int) { defer wg.Done() fmt.Println(i, "start locking!") // 給讀操作 上鎖 rwMutex.RLock() // 讀數據 fmt.Println(i, "Reading data") // 睡一下 time.Sleep(1 * time.Second) // 讀解鎖 rwMutex.RUnlock() //打印提示信息 fmt.Println(i, "Read over") } func writeData(i int) { defer wg.Done() fmt.Println(i, " Writing Start") //寫上鎖 rwMutex.Lock() fmt.Println(i, "~~~ writing right now~~~") time.Sleep(1 * time.Second) rwMutex.Unlock() fmt.Println(i, "writing completed") }
代碼運行結果如下:
2 start locking!
2 Reading data
4 Writing Start
1 start locking!
3 Writing Start
2 Read over
4 ~~~ writing right now~~~
4 writing completed
1 Reading data
1 Read over
3 ~~~ writing right now~~~
3 writing completed
main func end
以上就是關于“Go讀寫鎖操作的方法”這篇文章的內容,相信大家都有了一定的了解,希望小編分享的內容對大家有幫助,若想了解更多相關的知識內容,請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。