
就下面的这段代码
var a int var mu sync.Mutex func testMu(){ mu.Lock() a = 10 mu.Unlock() } 这个变量 a 能被锁住吗(个人测试的时候是没锁住的)
1 bandian OP 突然想明白了其中的原理,因为互斥锁的原理,同一时刻 mu 这个互斥锁最多尽可被一个线程获取,所以当线程 a 已经拿到了这个互斥锁,那线程 b 在获取 mu 这个互斥锁的时候就会被阻塞住,表现出来其实就是线程 b 中从 Lock() 到 Unlock() 之间的所有代码都被“锁”住了 但其实如果你在线程 b 中不去调用 mu 的 Lock() 方法,而是直接修改变量 a 的值是可以修改成功的 |
2 pipilu 2022-03-22 11:29:52 +08:00 可以修改成功但是 a 线程不可见吗? 为什么 go 不用 channel 解决线程同步问题 |