协程机制

61 阅读1分钟

Thread VS Groutine

  1. 创建时默认的stack的大小

    • JDK5以后Java Thread stack默认为1M
    • Groutine的stack初始化大小为2K
  2. 和KSE(Kernel Space Entity)的对应关系

    • Java Thread 是1 : 1
    • Groutine是 M : N

image.png

image.png

代码比较

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都是一个新的数据