Go實現了兩種併發形式。第一種是你們廣泛認知的:多線程共享內存。其實就是Java或者C++等語言中的多線程開發。另一種是Go語言特有的,
也是Go語言推薦的:CSP(communicating sequential processes)併發模型。 CSP併發模型是在1970年左右提出的概念,屬於比較新的概念,不一樣於傳統的多線程經過共享內存來通訊,CSP講究的是「以通訊的方式來共享內存」。 請記住下面這句話: Do not communicate by sharing memory; instead, share memory by communicating. 「不要以共享內存的方式來通訊,相反,要經過通訊來共享內存。」 普通的線程併發模型,就是像Java、C++、或者Python,他們線程間通訊都是經過共享內存的方式來進行的。很是典型的方式就是,
在訪問共享數據(例如數組、Map、或者某個結構體或對象)的時候,經過鎖來訪問,所以,在不少時候,衍生出一種方便操做的數據結構,叫作「線程安全的數據結構」。
例如Java提供的包」java.util.concurrent」中的數據結構。
1. goroutine-channelhtml
(1) gojava
go function_name...數組
(2) chan安全
varName chan typeName數據結構
src:termial_factorial_chan.go多線程
package main import ( "fmt" "os" "strconv" ) func main() { var val, x, y = 0, 0, 0 input, err := strconv.Atoi(os.Args[1]) if err != nil { fmt.Println(err) } ch := make(chan int) val = input for val > 0 { go factorial(val, ch) val-- } for j := 0; j < input; j++ { x = <-ch y = y + x } fmt.Println("階乘,累加", input, "=", y) } func factorial(num int, ch chan int){ ret2 := 1 for num > 1 { ret2 = ret2 * num num-- } ch <- ret2 }
exec:併發
go run termial_factorial_chan.go 18