聊聊Golang的讀寫鎖
Go語言中的RWMutex是一種讀寫鎖,它采用了讀寫分離的思想,可以同時支持多個讀操作,但只能同時有一個寫操作。它的原理是這樣的:
- RWMutex內(nèi)部維護(hù)兩個計數(shù)器,一個是讀計數(shù)器,一個是寫計數(shù)器。
- 在讀操作執(zhí)行時,讀計數(shù)器會加1,如果此時寫計數(shù)器的值不為0,則說明有寫操作正在進(jìn)行,那么這個讀操作就需要阻塞等待。
- 在寫操作執(zhí)行時,會先判斷讀計數(shù)器的值是否為0,如果不為0,則說明有讀操作正在進(jìn)行,那么這個寫操作就需要阻塞等待。寫操作執(zhí)行時,會把寫計數(shù)器加1,這樣其他讀寫操作就無法繼續(xù)執(zhí)行了。
- 當(dāng)讀操作執(zhí)行完畢時,讀計數(shù)器會減1,如果此時讀計數(shù)器的值為0,那么說明沒有其他讀操作在進(jìn)行了,可以允許寫操作了。
- 當(dāng)寫操作執(zhí)行完畢時,寫計數(shù)器會減1,如果此時寫計數(shù)器的值為0,那么說明沒有其他讀寫操作在進(jìn)行了,此時其他讀寫操作就可以繼續(xù)執(zhí)行了。
當(dāng)有大量讀時,寫操作不會餓死,這是因為讀寫鎖支持優(yōu)先處理寫操作的。具體來說,當(dāng)一個寫操作請求鎖時,如果此時已經(jīng)有其他讀或?qū)懖僮鞒钟墟i,那么該寫操作會被阻塞,等待其他操作釋放鎖。但是,一旦沒有任何讀或?qū)懖僮鞒钟墟i,那么該寫操作會立即獲取到鎖,并且優(yōu)先執(zhí)行,即使此時已經(jīng)有很多讀操作在等待。
也就是說讀寫鎖并不是公平鎖。因為并不保證等待時間最長的線程能夠最先獲取鎖。
如果需要使用公平鎖,可以考慮使用sync.Mutex,它保證等待時間最長的線程能夠最先獲取鎖。但是需要注意的是,公平鎖會導(dǎo)致額外的開銷,因為它需要維護(hù)等待隊列,進(jìn)行線程切換等操作。



































