更多学习笔记和示例代码请访问:github.com/wenjianzhan…
Thread vs. Groutine
- 创建时默认的 stack 的大小
- JDK5 以后 Java Thread stack 默认为1M
- Groutine 的 Stack 初始化大小为2k
- 和 KSE (Kernel Space Entity)的对应关系
- Java Thread 是 1:1
- Groutine 是 M:N
Groutine 的使用
func TestGroutine(t *testing.T) {
for i := 0; i < 10; i++ {
go func() {
fmt.Println(i)
}()
}
time.Sleep(time.Millisecond * 50)
}
输出
=== RUN TestGroutine
7
10
10
10
10
10
10
10
10
10
--- PASS: TestGroutine (0.05s)
PASS
Process finished with exit code 0
以上输出并不是我们理想的结果,那是因为 i 在多协程中,被共享了; 我们修改一下
func TestGroutine(t *testing.T) {
for i := 0; i < 10; i++ {
go func(i int) {
fmt.Println(i)
}(i)
}
time.Sleep(time.Millisecond * 50)
}
输出
=== RUN TestGroutine
6
1
3
0
2
4
5
8
9
7
--- PASS: TestGroutine (0.05s)
PASS
Process finished with exit code 0
这次输出了我们想要的结果,那是因为 go 的方法传递的时候都是值传递,所以在这里是被复制了一份,每一个协程里边的地址是不一样的,所以结果是不一样的;
更多学习笔记和示例代码请访问:github.com/wenjianzhan…