聊聊Golang的讀寫鎖
作者:浩仔浩仔
如果需要使用公平鎖,可以考慮使用sync.Mutex,它保證等待時間最長的線程能夠最先獲取鎖。但是需要注意的是,公平鎖會導致額外的開銷,因為它需要維護等待隊列,進行線程切換等操作。
Go語言中的RWMutex是一種讀寫鎖,它采用了讀寫分離的思想,可以同時支持多個讀操作,但只能同時有一個寫操作。它的原理是這樣的:
- RWMutex內部維護兩個計數器,一個是讀計數器,一個是寫計數器。
- 在讀操作執行時,讀計數器會加1,如果此時寫計數器的值不為0,則說明有寫操作正在進行,那么這個讀操作就需要阻塞等待。
- 在寫操作執行時,會先判斷讀計數器的值是否為0,如果不為0,則說明有讀操作正在進行,那么這個寫操作就需要阻塞等待。寫操作執行時,會把寫計數器加1,這樣其他讀寫操作就無法繼續執行了。
- 當讀操作執行完畢時,讀計數器會減1,如果此時讀計數器的值為0,那么說明沒有其他讀操作在進行了,可以允許寫操作了。
- 當寫操作執行完畢時,寫計數器會減1,如果此時寫計數器的值為0,那么說明沒有其他讀寫操作在進行了,此時其他讀寫操作就可以繼續執行了。
當有大量讀時,寫操作不會餓死,這是因為讀寫鎖支持優先處理寫操作的。具體來說,當一個寫操作請求鎖時,如果此時已經有其他讀或寫操作持有鎖,那么該寫操作會被阻塞,等待其他操作釋放鎖。但是,一旦沒有任何讀或寫操作持有鎖,那么該寫操作會立即獲取到鎖,并且優先執行,即使此時已經有很多讀操作在等待。
也就是說讀寫鎖并不是公平鎖。因為并不保證等待時間最長的線程能夠最先獲取鎖。
如果需要使用公平鎖,可以考慮使用sync.Mutex,它保證等待時間最長的線程能夠最先獲取鎖。但是需要注意的是,公平鎖會導致額外的開銷,因為它需要維護等待隊列,進行線程切換等操作。
責任編輯:武曉燕
來源:
今日頭條