golang 内存模型
1,是什么
是一套规范、内存操作指导
解决多线程编程的 程序的 原子性,有序性,可见性(主要)的问题。
多核操作系统,会存在缓存不一致的情况,说到底是一个同步的问题.
2, 内容
内存模型,除了定义了一套规范,还提供了一系列原语,封装了底层实现后,供开发者直接使用。
go 中:概括 (按照如下规范 使用 channel、sync 等进行同步)
在单独的goroutine中先行发生的顺序即是程序中表达的顺序。
如果包p引入(import)包q,那么q的init函数的结束先行发生于p的所有init函数开始main.main函数的开始发生在所有init函数结束之后
在channel的发送操作先行发生于对应的接收操作完成
对channel的关闭先行发生于接收到零值,因为channel已经被关闭了。
无缓冲channel的接收先行发生于发送完成
在容量为C的channel上的第k个接收先行发生于从这个channel上的第k+C次发送完成。
对任意的sync.Mutex或sync.RWMutex变量l和n < m,n次调用l.Unlock()先行发生于m次l.Lock()返回
对于sync.RWMutex变量l,任意的函数调用l.RLock满足第n次l.RLock后发生于第n次调用l.Unlock,对应的l.RUnlock先行发生于第n+1次调用l.Lock(此处luck、为写锁)。
通过once.Do(f)执行f()先行发生(指f()返回)于其他的once.Do(f)返回。
2,参考链接
建议阅读,有助于理解
java :
http://www.hollischuang.com/archives/2509
https://juejin.im/post/5b42c01ee51d45194e0b819a