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,参考链接

建议阅读,有助于理解

go: https://segmentfault.com/a/1190000008230146

java :
http://www.hollischuang.com/archives/2509
https://juejin.im/post/5b42c01ee51d45194e0b819a

posted @ 2019-01-09 11:34  名白  阅读(512)  评论(0编辑  收藏  举报