关于互斥锁的一些疑问

2022-03-22 10:34:21 +08:00
 bandian

就下面的这段代码

var a int
var mu sync.Mutex
func testMu(){
    mu.Lock()
    a = 10
    mu.Unlock()
}

这个变量 a 能被锁住吗(个人测试的时候是没锁住的)

683 次点击
所在节点    Go 编程语言
2 条回复
bandian
2022-03-22 10:52:30 +08:00
突然想明白了其中的原理,因为互斥锁的原理,同一时刻 mu 这个互斥锁最多尽可被一个线程获取,所以当线程 a 已经拿到了这个互斥锁,那线程 b 在获取 mu 这个互斥锁的时候就会被阻塞住,表现出来其实就是线程 b 中从 Lock() 到 Unlock() 之间的所有代码都被“锁”住了

但其实如果你在线程 b 中不去调用 mu 的 Lock() 方法,而是直接修改变量 a 的值是可以修改成功的
pipilu
2022-03-22 11:29:52 +08:00
可以修改成功但是 a 线程不可见吗?
为什么 go 不用 channel 解决线程同步问题

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/842029

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX