這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
讀寫鎖是針對於讀寫操作的互斥鎖。
基本遵循兩大原則:
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