内存模型
- 面向并发
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 string
func aGoroutine() {
    msg = "你好, 世界"
    done <- true
}
func main() {
    go aGoroutine()
    <-done
    println(msg)
}