1.1runtime包//子go程
func sing(i int)
//子go程
func dance(i int)
//主go程
func main()
//主go程結束,子go程隨之退出。所以這裡要睡10秒等子go程執行完畢,不然看不見子go程列印輸出。
time.sleep(10 * time.second)
}
len(ch):channel 中剩餘未讀取資料個數。cap(ch):通道的容量。
確定不再相對端傳送、接收資料。關閉channel。使用:close(chs)
2.1單向channelfunc main() else
//迴圈寫
go func()
close(chs) //關閉channel
}()//迴圈讀
for ch := range chs
}
ch4 := make(chan int)
ch5 := <-chan int(ch4) // ch5就是乙個單向的讀取channel
ch6 := chan<- int(ch4) // ch6 是乙個單向的寫入channel
func parse(ch <-chan int)
}
select
3.1超時機制func main()
i := <-ch
fmt.println("value received:", i)
}}
func main() ()
// 然後我們把timeout這個channel利用起來
select
}
4.1條件變數//生產者:單向寫channel
func producer(out chan<- int, idx int)
}//消費者:單向讀channel
func consumer(in <-chan int, idx int)
}func main()
for i := 0; i < 1; i++
quit := make(chan bool)
<-quit //沒有寫,直接讀,讓主go程阻塞
}
var cond sync.cond // 定義全域性條件變數
func producer(out chan<- int, idx int)
num := rand.intn(800) //產生隨機數
out <- num
fmt.printf("生產者%dth,生產:%d\n", idx, num)
cond.l.unlock() // 訪問公共區結束,並且列印結束,解鎖
// 喚醒阻塞在條件變數上的 消費者
cond.signal() 廣播方式,喚醒全部生產者
time.sleep(time.millisecond * 200) }}
func consumer(in <-chan int, idx int)
num := <-in
fmt.printf("-----消費者%dth,消費:%d\n", idx, num)
cond.l.unlock() // 訪問公共區結束後,解鎖
// 喚醒 阻塞在條件變數上的 生產者
cond.signal() 廣播方式,喚醒全部生產者
time.sleep(time.millisecond * 200) }}
func main()
for i := 0; i < 5; i++
quit := make(chan bool)
<-quit //沒有寫,直接讀,讓主go程阻塞
}
5.1定時器重置、停止//第一種定時:sleep
func timer1()
//第二種定時:newtimer
func timer2()
//第三種定時:after
func timer3()
func main()
5.2週期定時器func main() ()
mytimer.stop() //停止,將定時器歸零。 <-mytimer.c 會阻塞
time.sleep(10 * time.second)
fmt.println("主go程醒了。。。")
}
6.1channel同步func main()
}()time.sleep(10 * time.second)
fmt.println("週期定時器。。。")
}
6.2同步鎖func print(str string)
}func print1(ch chan int)
func print2(ch chan int)
func main()
6.3全域性唯一性var lock sync.mutex
func print(str string)
lock.unlock()
}func print1()
func print2()
func main()
var once sync.once
func setup()
func doprint()
func main()
}()time.sleep(10 * time.second)
}
初始化完成。。。
開始搞事情。。。
開始搞事情。。。
開始搞事情。。。
開始搞事情。。。
開始搞事情。。。
併發程式設計的藝術(一) 併發程式設計的挑戰
含義 cpu通過給每個執行緒分配cpu時間片實現多執行緒執行 當前任務執行乙個時間片後會切換下乙個任務,但切換前會儲存上乙個任務的狀態,從儲存到載入的過程就是一次上下文切換。但執行緒會有建立和上下文切換的開銷,所以多執行緒不一定快。減少上下文切換方法 無鎖併發程式設計 如id按hash演算法取模,不...
java併發程式設計(一) 併發程式設計需要注意問題
目錄 問題一上下文切換會帶來額外的開銷 執行緒的執行機制 什麼是上下文切換 上下文切換的過程 上下文切換是有開銷的 如何減少上下文切換 問題二併發不當可能會產生死鎖 什麼是死鎖 死鎖示例 如何避免死鎖 問題三計算機資源會限制併發 誤區執行緒越多速度越快 什麼是資源 如何解決資源的限制 併發是為了提公...
一 併發簡介
1.1併發簡史 早期的馮丶諾依曼型計算機的主要特點是 1.數字計算機的數制採用二進位制 2.計算機應該按照程式順序執行。之後伴隨著作業系統的誕生,使得計算機每次可以執行多個程式,每個程式執行在單獨的程序中。早期的分時系統中,每乙個程序相當於一台虛擬的馮丶諾依曼型計算機。程序是作業系統分配資源的最小單...