併發技術4:讀寫鎖
讀寫鎖概述
- 除了上一篇提到的互斥鎖以外,Go語言還給我們提供了另一種資源鎖——讀寫鎖(sync.RWMutex);
- 讀寫鎖可以鎖定和解鎖兩種模式:只讀模式和只寫模式:
- 只讀模式:多路只讀不可寫;
- 只寫模式:單路只寫不可讀;
只讀模式示例
//定義讀寫鎖
var rwMutex sync.RWMutex
/*只讀模式:多路只讀不可寫*/
func main() {
for i := 0; i < 3; i++ {
go read(i)
}
time.Sleep(500 * time.Millisecond)
for i := 0; i < 3; i++ {
go write(i)
}
time.Sleep(10*time.Second)
}
func read(i int) {
rwMutex.RLock()
fmt.Println(i, "reading...")
time.Sleep(time.Second)
fmt.Println(i, "read over")
rwMutex.RUnlock()
}
func write(i int) {
rwMutex.Lock()
fmt.Println(i, "writing...")
time.Sleep(time.Second)
fmt.Println(i, "write over")
rwMutex.Unlock()
}
其輸出效果為:
1 reading…
2 reading…
0 reading…
0 read over
2 read over
1 read over
2 writing…
2 write over
0 writing…
0 write over
1 writing…
1 write over
不難看出,在只讀模式下,三條協程同時在進行讀取;而只有全部讀取協程結束並釋放只讀鎖後,寫模式才得以執行——此之謂“多路只讀不可寫”
只寫模式示例
//定義讀寫鎖
var rwMutex sync.RWMutex
/*只寫模式:單路只寫不可讀*/
func main() {
for i := 0; i < 3; i++ {
go write(i)
}
time.Sleep(500 * time.Millisecond)
for i := 0; i < 3; i++ {
go read(i)
}
time.Sleep(10*time.Second)
}
func read(i int) {
rwMutex.RLock()
fmt.Println(i, "reading...")
time.Sleep(time.Second)
fmt.Println(i, "read over")
rwMutex.RUnlock()
}
func write(i int) {
rwMutex.Lock()
fmt.Println(i, "writing...")
time.Sleep(time.Second)
fmt.Println(i, "write over")
rwMutex.Unlock()
}
其輸出為:
1 writing…
1 write over
0 reading…
1 reading…
2 reading…
2 read over
0 read over
1 read over
2 writing…
2 write over
0 writing…
0 write over
不難看出,在只寫鎖釋放之前,只有一條協程可以執行寫操作,其餘協程無論讀寫都被阻塞——此之謂“單路只寫不可讀”;
當只寫鎖釋放時,首先被只讀鎖搶到資源,又是一個三路齊讀沒有寫;
最後再次鎖定為只寫時,也是逐條寫入直到釋放只寫鎖,其間其餘的寫協程全部被阻塞;
學院Go語言視訊主頁
https://edu.csdn.net/lecturer/1928
清華團隊帶你實戰區塊鏈開發
掃碼獲取海量視訊及原始碼 QQ群:721929980
相關文章
- Java併發——讀寫鎖ReentrantReadWriteLockJava
- Java併發-顯式鎖篇【可重入鎖+讀寫鎖】Java
- 多執行緒與併發----讀寫鎖執行緒
- Java併發程式設計-讀寫鎖(ReentrantReadWriteLock)Java程式設計
- 併發技術5:死鎖問題
- 併發技術4:同步排程
- Java併發4:鎖Java
- 【併發技術04】執行緒技術之死鎖問題執行緒
- Java併發程式設計之鎖機制之ReentrantReadWriteLock(讀寫鎖)Java程式設計
- Java併發(8)- 讀寫鎖中的效能之王:StampedLockJava
- 【java併發程式設計】ReentrantLock 可重入讀寫鎖Java程式設計ReentrantLock
- 多執行緒與併發-----Lock鎖技術執行緒
- Java併發指南10:Java 讀寫鎖 ReentrantReadWriteLock 原始碼分析Java原始碼
- java併發程式設計-StampedLock高效能讀寫鎖Java程式設計
- 多執行緒系列(十一) -淺析併發讀寫鎖StampedLock執行緒
- gorm操作sqlite3,高併發讀寫如何避免鎖庫?GoORMSQLite
- Java併發包原始碼學習系列:ReentrantReadWriteLock讀寫鎖解析Java原始碼
- 「分散式技術專題」併發系列一:基於加鎖的併發控制分散式
- 高併發核心技術 - 冪等性 與 分散式鎖分散式
- 為什麼有了併發安全的集合還需要讀寫鎖?
- Java併發基礎-鎖的使用及原理(可重入鎖、讀寫鎖、內建鎖、訊號量等)Java
- 高併發技術
- 讀寫鎖
- 併發技術1:CSP併發理論
- GO-併發技術Go
- 併發技術中同步
- Java併發基礎04:執行緒技術之死鎖問題Java執行緒
- 讀寫鎖 ReentrantReadWriteLock
- 2020年4月技術導讀
- Lock鎖之重入鎖與讀寫鎖
- 併發程式設計之——寫鎖原始碼分析程式設計原始碼
- Java讀寫鎖ReadWriteLockJava
- Java併發程式設計實戰(4)- 死鎖Java程式設計
- ☕【Java技術指南】「併發原理專題」AQS的技術體系之CLH、MCS鎖的原理及實現JavaAQS
- 高併發(鎖)
- 併發:死鎖
- 併發技術3:定時器定時器
- 併發技術3:管道通訊