Golang内存模型解析-1

看了Golang后,首先感觉实在和C、C++很像。但是在并发处理等地方又做了很多的自动化工作。回想到学习C++时最重要的一步是了解C++内存模型,所以今天也特意看了一下Go语言的内存模型,希望可以进一步了解Go语言。

原文地址:https://golang.org/ref/mem

重点:

Happen-Before原理及可见性原理

1)Go语言的编译器和处理器会对goroutine的指令进行重新排序,像jvm一样。但是前提是不改变goroutine内部行为。也就是说,其他goroutine可能会受到影响。

2)为了避免这种影响,Go语言首先定义了Happen-before和Happen-after:

Within a single goroutine, the happens-before order is the order expressed by the program.

对一个变量v,我们定义对他的读操作为R,写操作为W,那么R可以观测到W的条件是:

  1. R不是W的Happen-before
  2. 在W和R中间的时间内,变量v没有遇到其他写操作W’
对一个变量v,我们定义对他的读操作为R,写操作为W,那么R 必定会观测到W的条件是:
  1. W是R的Happen-before
  2. 其他对变量v的写操作在W之前或者R之后
单个goroutine时,以上两种情况等价。但是多个goroutine并发读取共享变量v时,我们需要构造出以上两种情况中的其中一种从而满足程序的具体需求。强制可见性必须使用第二种情况。
Synchronization
1)程序初始化是只有一个goroutine。但是它可能创建其他goroutine
2)如果package P import了 package Q, 则Q的init方法Happen-beforeP的init方法
3)程序中创建goroutine的命令,Happen-before 这个goroutine的执行。(我的理解是,go func()命令中,先创建goroutine,然后才调用指定函数)
4)goroutine的销毁不会保证在某一个具体事件之前执行。即销毁时间是由编译器决定的


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值