Thread VS Groutine
-
创建时默认的stack的大小
- JDK5以后Java Thread stack默认为1M
- Groutine的stack初始化大小为2K
-
和KSE(Kernel Space Entity)的对应关系
- Java Thread 是1 : 1
- Groutine是 M : N
代码比较
func TestGroutine(t *testing.T) {
for i := 0; i < 10; i++ {
go func(i) {
fmt.Println(i)
}(i)
}
time.Sleep(time.Second * 2)
}
上述代码输出的结果有这几个特点
- 全部都是0~9这几个数
- 输出顺序是乱序的
- 每次执行输出的结果都是不一样的
func TestGroutine(t *testing.T) {
for i := 0; i < 10; i++ {
go func() {
fmt.Println(i)
}()
}
time.Sleep(time.Second * 2)
}
上述代码输出的结果有这几个特点
- 全部都是10
- 每次执行输出的结果都是一样的
造成上面两个代码输出结果不同的原因是因为go里面的函数调用的传值特性,全部都是值传递,像第二示例代码中,每个协程使用的i都是同一份,那最后i的结果就是到10程序退出 而第一个示例代码中,每个协程使用的i都是一个新的数据