併發技術5:死鎖問題
1. 同一個goroutine中,使用同一個 channel 讀寫
package main
func main(){
ch:=make(chan int) //這就是在main程裡面發生的死鎖情況
ch<-6 // 這裡會發生一直阻塞的情況,執行不到下面一句
<-ch
}
這是最簡單的死鎖情況
看執行結果
1. 2個 以上的go程中, 使用同一個 channel 通訊。 讀寫channel 先於 go程建立。
package main
func main(){
ch:=make(chan int)
ch<-666 //這裡一直阻塞,執行不到下面
go func (){
<-ch //這裡雖然建立了子go程用來讀出資料,但是上面會一直阻塞執行不到下面
}()
}
這裡如果想不成為死鎖那匿名函式go程就要放到ch<-666這條語句前面
3. 2個以上的go程中,使用多個 channel 通訊。 A go 程 獲取channel 1 的同時,嘗試使用channel 2, 同一時刻,B go 程 獲取channel 2 的同時,嘗試使用channel 1
package main
func main() {
ch1 := make(chan int)
ch2 := make(chan int)
go func() { //匿名子go程
for {
select { //這裡互相等對方造成死鎖
case <-ch1: //這裡ch1有資料讀出才會執行下一句
ch2 <- 777
}
}
}()
for { //主go程
select {
case <-ch2 : //這裡ch2有資料讀出才會執行下一句
ch1 <- 999
}
}
}
第三種是互相等對方造成死鎖
4.注意讀寫模式的鎖定不要互相阻塞
- 隱形死鎖:系統的兩個或多個任務之間互相阻塞對方,形成事實上的死鎖局面,然而只要有可執行的協程,編譯器就不會顯式地報死鎖錯誤——這就是隱形死鎖;
- 開發中真正可怕的不是顯式的死鎖,而是隱形死鎖;
func main() {
var rwm09 sync.RWMutex
ch := make(chan int, 0)
//子協程負責寫入
go func() {
//連鎖都搶不到555...
rwm09.Lock()
ch <- 123
rwm09.Unlock()
}()
go func() {
//本協程負責讀出
rwm09.RLock()
//只要讀不到內容就永遠阻塞
x := <- ch
fmt.Println("讀到",x)
rwm09.RUnlock()
}()
for {
//通知垃圾回收器來清理垃圾(即使不叫也會定時清理)
runtime.GC()
}
}
學院Go語言視訊主頁
https://edu.csdn.net/lecturer/1928
[清華團隊帶你實戰區塊鏈開發]
(https://ke.qq.com/course/344443?tuin=3d17195d)
掃碼獲取海量視訊及原始碼 QQ群:721929980
相關文章
- Python | 淺談併發鎖與死鎖問題Python
- 【併發技術04】執行緒技術之死鎖問題執行緒
- 線上併發事務死鎖問題排查
- 併發:死鎖
- Java併發基礎04:執行緒技術之死鎖問題Java執行緒
- [Java併發]避免死鎖Java
- MySQL死鎖問題MySql
- 併發技術4:讀寫鎖
- MySQL 死鎖問題分析MySql
- MySQL死鎖系列-線上死鎖問題排查思路MySql
- 「分散式技術專題」併發系列一:基於加鎖的併發控制分散式
- MySQL鎖等待與死鎖問題分析MySql
- SpringBoot Seata 死鎖問題排查Spring Boot
- 解決庫存扣減及訂單建立時防止併發死鎖的問題
- 用分散式鎖解決併發問題分散式
- 多執行緒與併發-----Lock鎖技術執行緒
- 解決Oracle死鎖問題步驟Oracle
- Java併發程式設計實戰(4)- 死鎖Java程式設計
- Oracle死鎖一例(ORA-00060),鎖表導致的業務死鎖問題Oracle
- Mysql使用kill命令解決死鎖問題MySql
- 高併發核心技術 - 冪等性 與 分散式鎖分散式
- ☕【Java技術指南】「併發原理專題」AQS的技術體系之CLH、MCS鎖的原理及實現JavaAQS
- 4種Golang併發操作中常見的死鎖情形Golang
- 「架構技術專題」9種高效能高可用高併發的技術架構(5)架構
- 高併發技術
- 故障分析 | 從 Insert 併發死鎖分析 Insert 加鎖原始碼邏輯原始碼
- JAVA死鎖排查-效能測試問題排查思路Java
- 記一次 MySQL select for update 死鎖問題MySql
- 聊聊Java併發面試問題之公平鎖與非公平鎖是啥?Java面試
- 併發技術1:CSP併發理論
- GO-併發技術Go
- 併發技術中同步
- SQLServer 如何收集資料以排除 SQL 死鎖問題SQLServer
- 手把手教你分析解決MySQL死鎖問題MySql
- AdornerDecorator的CacheMode繫結和windows鎖屏導致TableControl鎖死問題Windows
- 死鎖問題排查過程-間隙鎖的復現以及解決
- 併發程式設計之臨界區\阻塞\非阻塞\死鎖\飢餓\活鎖程式設計
- 作業系統(5) 死鎖的概念 死鎖產生的必要條件 死鎖的處理策略 預防死鎖 避免死鎖 死鎖的檢測和解除 銀行家演算法作業系統演算法