账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    golang 会自动加锁保证并发安全吗?
    33
    0

    golang 的版本是 1.9.2

    最近接触 golang 的并发加锁功能,按照例子做了一个多 goroutine 计数的练习,发现加锁和不加锁的运行结果是一样的,请问这是机器的缘故吗?(至少在我的电脑上和 https://play.golang.org/ 上模拟是这样的) 还是说 1.9 版本的 go 已经不用 mutex 锁数据了?如果是我的测试方法的问题,那么如何能正确的方式测试出加锁和不加锁的区别呢?

    代码如下:

    package main
    
    import (
        "fmt"
        "sync"
        "time"
    )
    
    type SafeCounter struct {
        v  map[string]int
        mux sync.Mutex
    }
    
    func (c *SafeCounter) Inc(key string) {
    
        c.mux.Lock()
    
        c.v[key]++
    
        c.mux.Unlock()
    }
    
    func (c *SafeCounter) Value(key string) int {
    
        defer c.mux.Unlock()
    
        c.mux.Lock()
    
        return c.v[key]
    }
    
    func main() {
        c := SafeCounter{
            v: make(map[string]int),
        }
    
        for i := 0; i < 1000; i++ {
            go c.Inc("somekey")
        }
    
        time.Sleep(time.Second)
    
        fmt.Println(c.Value("somekey"))
    }
    
    

    输出结果是 1000
    把所有的锁去掉,还是 1000

    0
    打赏
    收藏
    点击回答
        全部回答
    • 0
    • 是的,Go语言会自动在多线程环境中添加锁来保证并发安全。Go语言中的goroutine(goroutine是协程)的锁是自动管理的。每个goroutine都有一个自己的锁,这样其他goroutine就无法同时访问共享资源。

      当一个goroutine试图访问共享资源时,Go语言会检查该资源是否已经被其他goroutine锁定。如果没有被锁定,那么该goroutine可以访问资源;如果有被锁定,那么Go语言会拒绝该goroutine的访问,并告诉它锁已经被其他goroutine锁定。

      Go语言还提供了一个全局的锁系统,叫做sync包,可以用来管理整个程序的锁。通过使用sync包,开发者可以更好地控制多线程环境中的锁的使用。

      总的来说,Go语言会自动为多线程环境添加锁来保证并发安全。但是,开发者仍然需要小心地管理锁,以防止死锁和其他问题。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部