golang中的读写锁
生活随笔
收集整理的這篇文章主要介紹了
golang中的读写锁
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
簡(jiǎn)介
互斥鎖本質(zhì)是當(dāng)一個(gè)協(xié)程訪問(wèn)的時(shí)候,其他協(xié)程都不能訪問(wèn).
其實(shí)主要是想:修改數(shù)據(jù)要同步,這樣其他協(xié)程才可以感知到,所以真正的互斥應(yīng)該是讀取和修改,修改和修改之間,讀和讀是沒(méi)有互斥操作的必要的
讀寫鎖可以讓多個(gè)讀并發(fā),但是對(duì)于寫是互斥的.
當(dāng)一個(gè)協(xié)程在寫的時(shí)候,其他協(xié)程不能讀也不能寫
同時(shí)只能存在寫鎖定或讀鎖定(讀和寫互斥)
go中的讀寫鎖由結(jié)構(gòu)類型sync.RWMutex表示.這個(gè)類型的方法集合中包含兩對(duì)方法
一組是對(duì)寫操作的鎖定和解鎖,簡(jiǎn)稱:寫鎖定和寫解鎖
另一組表示對(duì)讀操作的鎖定和解鎖,簡(jiǎn)稱為讀鎖定和讀解鎖
func (*RWMutex) RLock() func (*RWMutex) RUlock()讀時(shí)共享,寫時(shí)獨(dú)占.
寫優(yōu)先級(jí)比讀高
讀鎖也算個(gè)鎖,鎖只能有一把
package mainimport ("fmt""sync" )func main() {var mutex sync.Mutexfmt.Printf("%+v\n", mutex)mutex.Lock()fmt.Printf("%+v\n", mutex)mutex.Unlock()fmt.Printf("%+v\n", mutex) }輸出
{state:0 sema:0} {state:1 sema:0} {state:0 sema:0}可以看出當(dāng)Lock()時(shí),state為1,Unlock()時(shí),state為0。
使用
讀寫鎖,最好不要和channel一起使用會(huì)造成死鎖
//創(chuàng)建讀寫鎖 var mx sync.RWMutex//讀 func readGo(in <-chan int, idx int) {for {//mx.RLock() //讀鎖//要求寫端同時(shí)在線,自己阻塞num := <-infmt.Println("讀取: ", num, idx)time.Sleep(time.Millisecond * 300) //放大實(shí)驗(yàn)現(xiàn)象//mx.RUnlock()}}//寫 func writeGo(out chan<- int, idx int) {for {//生成隨機(jī)數(shù)num := rand.Intn(1000)mx.Lock() //寫鎖out <- numfmt.Println("------寫入: ", num, idx)time.Sleep(time.Millisecond * 30) //放大實(shí)驗(yàn)現(xiàn)象mx.Unlock()} }func main() {//播種隨機(jī)數(shù)rand.Seed(time.Now().UnixNano())ch := make(chan int) //數(shù)據(jù)傳遞的channelfor i := 0; i < 5; i++ {go writeGo(ch, i+1)}for i := 0; i < 5; i++ {go readGo(ch, i+1)}for {;}}全局變量數(shù)據(jù)同步
//創(chuàng)建讀寫鎖 var mx sync.RWMutex var i int //全局變量模擬共享數(shù)據(jù)//讀 func readGo(idx int) {for {mx.RLock() //讀鎖num := ifmt.Println("讀取: ", num, idx)//time.Sleep(time.Millisecond * 30) //放大實(shí)驗(yàn)現(xiàn)象mx.RUnlock()}}//寫 func writeGo(idx int) {for {mx.Lock() //寫鎖//生成隨機(jī)數(shù)num := rand.Intn(1000)i = numfmt.Println("------寫入: ", num, idx)time.Sleep(time.Millisecond * 30) //放大實(shí)驗(yàn)現(xiàn)象mx.Unlock()} }func main() {//播種隨機(jī)數(shù)rand.Seed(time.Now().UnixNano())for i := 0; i < 5; i++ { //5個(gè)讀過(guò)程go readGo(i+1)}for i := 0; i < 5; i++ { //5個(gè)寫過(guò)程go writeGo(i+1)}for {;} }總結(jié)
以上是生活随笔為你收集整理的golang中的读写锁的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: golang中的互斥锁
- 下一篇: golang中的条件变量