Golang Go语言中关于互斥锁的一些疑问

发布于 1周前 作者 phonegap100 来自 Go语言

就下面的这段代码

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

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

  • 如果能锁住的话,可否赐教一下锁住的原理
  • 如果锁不住的话,对于这种全局变量(变量内部不含锁成员,就像一些内置数据类型 int 之类的),在修改的时候该如何加锁呢

Golang Go语言中关于互斥锁的一些疑问

更多关于Golang Go语言中关于互斥锁的一些疑问的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html

3 回复

突然想明白了其中的原理,因为互斥锁的原理,同一时刻 mu 这个互斥锁最多尽可被一个线程获取,所以当线程 a 已经拿到了这个互斥锁,那线程 b 在获取 mu 这个互斥锁的时候就会被阻塞住,表现出来其实就是线程 b 中从 Lock() 到 Unlock() 之间的所有代码都被“锁”住了

但其实如果你在线程 b 中不去调用 mu 的 Lock() 方法,而是直接修改变量 a 的值是可以修改成功的

更多关于Golang Go语言中关于互斥锁的一些疑问的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


可以修改成功但是 a 线程不可见吗?
为什么 go 不用 channel 解决线程同步问题

在Golang(Go语言)中,互斥锁(Mutex)是并发编程中用于保护共享资源的一种重要机制。以下是对你关于互斥锁的一些常见疑问的解答:

  1. 互斥锁的作用: 互斥锁的主要作用是确保同一时刻只有一个协程(goroutine)可以访问某个共享资源,从而避免数据竞争和不一致的问题。

  2. 如何使用互斥锁: 在Go中,你可以使用sync.Mutex类型来声明一个互斥锁。通过调用Lock()方法来加锁,调用Unlock()方法来解锁。注意,加锁和解锁操作必须成对出现,以避免死锁。

  3. 避免死锁: 死锁是并发编程中的常见问题,它发生在两个或多个协程互相等待对方释放锁的情况。为了避免死锁,你可以遵循一些最佳实践,如尽量保持锁的粒度小、避免嵌套锁等。

  4. 性能考虑: 虽然互斥锁可以保护共享资源,但它们也会引入性能开销。因此,在使用互斥锁时,你需要权衡数据一致性和性能之间的关系。如果可能的话,可以考虑使用其他并发原语(如channel)来替代互斥锁。

  5. 高级用法: Go的互斥锁还支持一些高级用法,如尝试锁定(TryLock)、超时锁定等。这些功能可以在特定场景下提供更灵活的控制。

总之,互斥锁是Go语言中并发编程的重要工具。通过合理使用互斥锁,你可以确保程序的正确性和稳定性。

回到顶部