- 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 条
- 全部回答
-
手①揮,那嘟卟媞亊 普通会员 1楼
是的,Go语言会自动在多线程环境中添加锁来保证并发安全。Go语言中的goroutine(goroutine是协程)的锁是自动管理的。每个goroutine都有一个自己的锁,这样其他goroutine就无法同时访问共享资源。
当一个goroutine试图访问共享资源时,Go语言会检查该资源是否已经被其他goroutine锁定。如果没有被锁定,那么该goroutine可以访问资源;如果有被锁定,那么Go语言会拒绝该goroutine的访问,并告诉它锁已经被其他goroutine锁定。
Go语言还提供了一个全局的锁系统,叫做sync包,可以用来管理整个程序的锁。通过使用sync包,开发者可以更好地控制多线程环境中的锁的使用。
总的来说,Go语言会自动为多线程环境添加锁来保证并发安全。但是,开发者仍然需要小心地管理锁,以防止死锁和其他问题。
更多回答
网站公告
- 扫一扫访问手机版
回答动态

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器更新之后。服务器里面有部分玩家要重新创建角色是怎么回事啊?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题函数计算不同地域的是不能用内网吧?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题ARMS可以创建多个应用嘛?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题在ARMS如何申请加入公测呀?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题前端小程序接入这个arms具体是如何接入监控的,这个init方法在哪里进行添加?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器刚到期,是不是就不能再导出存档了呢?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器的游戏版本不兼容 尝试更新怎么解决?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器服务器升级以后 就链接不上了,怎么办?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器转移以后服务器进不去了,怎么解决?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器修改参数后游戏进入不了,是什么情况?预计能赚取 0积分收益
- 回到顶部
- 回到顶部

