内存模型

Goroutine

Goroutine采用的是半抢占式的协作调度,只有在当前Goroutine发生阻塞时才会导致调度,且调度发生在用户态,所以Goroutine是一种比线程更加轻量的玩意

原子操作

var ai struct {    sync.Mutex    value int}func main() {    go worker();    go worker();}func worker(){    ai.Lock();    ai.value += 1;    ai.Unlock();}

这种方式比较繁琐且效率低,标准库的sync/atomic包对原子操作提供了丰富的支持

顺序一致性内存模型

同JVM 在Go语言中 编译器也会进行乱序优化

但Go保证在同一个Goroutine中不会乱序

基于Channel的通信

Channel通信是在Goroutine之间进行同步的主要方法,无缓存的Channel上的发送操作总在对应的接收操作完成前发生

var done = make(chan bool)var msg stringfunc aGoroutine() {    msg = "你好, 世界"    done <- true}func main() {    go aGoroutine()    <-done    println(msg)}