初级会员
  • 第 54004 位会员
  • kzh125
  • 2020-06-15 23:07:05
  • Offline
  • 20 81

最近发布的文章

    暂无

最近分享的资源

    暂无

最近发布的项目

    暂无

最近的评论

  • 评论了主题 关于go执行报错
    go run main.go v1.go v2.go 或者 go run *.go 或者go build,之后再运行
  • #19 @jarlyyn 这个版本看起来好像没是OK的,我研究研究......
  • 不能期望所有goroutine按照期望的顺序执行代码。 就像你期望goroutine_01 使用countlocker 加锁进行 count--之前,另外一个goroutine_02能获取到countlocker 并进行count++ 但这种直觉是不正确的,也有可能是goroutine_01 又获取到了countlocker并进行count-- 这也导致了bug的产生
  • sync.Mutex没有bug,是你的代码的bug。 我举的是只是例子而已。实际上有可能是两个goroutine,其中一个count--后从map删除Locker,之后又来一个goroutine获取了新的不同的锁,起不到加锁的作用。 我的代码 count++ 和count-- 以及其他变量被限制在同一个goroutine里,所以不会有这种bug。
  • 你这个代码有bug: 我举一个极端的例子: 假设有10个并发传入了相同的key,其中`goroutine_01`先进行`count++`并获取了`Locker`结构体 另外9个卡在了`l := v.(*Locker)`这一行和下一行之间 之后`goroutine_01`又进行`count--`并从map中删除了`Locker`结构体, 然后另外9个goroutine调用的`Locker`函数返回,从而获取了与`goroutine_01`相同的`Locker`结构体 之后又来了10个并发传入了相同key,由于map中已经没有这个key关联的`Locker`结构体,所以获取的是一个新的`Locker`结构体 也就是说后面的10个,和前面剩余的9个用的不是同一把锁,也就起不到加锁的作用