go中的讀寫鎖RWMutex

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。

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

基本遵循兩大原則:

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.