go中的讀寫鎖RWMutex


讀寫鎖是針對於讀寫操作的互斥鎖。

基本遵循兩大原則:

1、可以隨便讀。多個goroutin同時讀。

2、寫的時候,啥都不能干。不能讀,也不能寫。

 

解釋:

在32位的操作系統中,針對int64類型值的讀操作和寫操作不可能只由一個CPU指令完成。如果一個寫的操作剛執行完了第一個指令,時間片換給另一個讀的協程,這就會讀到一個錯誤的數據。

 

RWMutex提供四個方法:

 

func (*RWMutex) Lock //寫鎖定

func (*RWMutex) Unlock //寫解鎖

func (*RWMutex) RLock //讀鎖定

func (*RWMutex) RUnlock //讀解鎖

 

代碼實例:

1、可以隨便讀:

package main

 

import (

"sync"

"time"

)

 

var m *sync.RWMutex

 

func main() {

m = new(sync.RWMutex)

 

//可以多個同時讀

go read(1)

go read(2)

 

time.Sleep(2 * time.Second)

}

 

func read(i int) {

println(i, "read start")

 

m.RLock()

println(i, "reading")

time.Sleep(1 * time.Second)

m.RUnlock()

 

println(i, "read end")

}

 

運行結果:

1 read start

1 reading

2 read start

2 reading

1 read end

2 read end

可以看到1讀還沒結束(倒數第二行)的時候,2已經在讀(倒數第三行)了。

 

2、寫的時候啥也不能干:

package main

 

import (

"sync"

"time"

)

 

var m *sync.RWMutex

 

func main() {

m = new(sync.RWMutex)

 

//寫的時候啥都不能干

go write(1)

go read(2)

go write(3)

 

time.Sleep(4 * time.Second)

}

 

func read(i int) {

println(i, "read start")

 

m.RLock()

println(i, "reading")

time.Sleep(1 * time.Second)

m.RUnlock()

 

println(i, "read end")

}

 

func write(i int) {

println(i, "write start")

 

m.Lock()

println(i, "writing")

time.Sleep(1 * time.Second)

m.Unlock()

 

println(i, "write end")

}

 

輸出:

 

1 write start

1 writing

2 read start

3 write start

1 write end

2 reading

2 read end

3 writing

3 write end

可以看到:

1、1 write end結束之后,2才能reading

2、2 read end結束之后,3 才能writing


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM