golang 内存模型

名之白 · · 1643 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

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


有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:名之白

查看原文:golang 内存模型

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1643 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传