它使我困惑,我阅读golang内存模型,https://golang.org/ref/mem
var l sync.Mutex
var a string
func f() {
a = "hello, world"
l.Unlock()
}
func main() {
l.Lock()
go f()
l.Lock()
print(a)
}
字符串
互斥锁按原子解锁
UnLock: new := atomic.AddInt32(&m.state, -mutexLocked)
Lock: atomic.CompareAndSwapInt32(&m.state, 0, mutexLocked)
型
我的问题是,如果原子AddInt32,CompareAndSwapInt32将导致内存障碍,如果a
将在不同的goroutine中可见。
在java中,我知道AtomicInteger,内存屏障由“volatile”组成,保持线程字段可见。
2条答案
按热度按时间csga3l581#
Go没有volatile等价物。原子内存模型在Go语言中没有很好的定义,所以为了超级安全,你应该什么都不做,也就是说。对
a
的改变可以是不可见的。但在实践中,正如我所理解的,所有体系结构都有一个内存围栏,所以你是安全的。有一个big issue关于定义行为,Russ考克斯评论说
是的,去年冬天我花了一段时间写这个,但还没有机会把它写好。简短的版本是,我相当肯定的规则是,Go的原子保证原子变量之间的顺序一致性(表现得像C/C++的seqconst原子),并且对于给定的内存字,你不应该混合原子和非原子访问。
相关答案https://stackoverflow.com/a/58892365/2133484
czq61nw12#
测试程序:
字符串
通过以下方式检查组件:
型
LOCK指令is:
所以,是的,它具有内存可见性。