atomic和mutex锁问题

atomic和mutex锁问题

曹大,昨天直播中提到了

  1. atomic和mutex分别在什么情况下用会比较好,channel用的是mutex吗?

    1. 尽量 mutex

    2. 一些比较简单的场景,比如:

      1. 配置加载双 buffer,可以用 atomic。

      2. 并发安全计数器,可以用 atomic

    3. atomic 相对来说是比较底层的 API,应用层还是尽量少用~除非在锁有明显的性能瓶颈时,需要考虑优化。

私下我测试了下


// sync.Mutex
func test1() {
var wg sync.WaitGroup
  var mutex sync.Mutex
  count := int64(0)
t := time.Now()
for i := 0; i < 10000; i++ {
wg.Add(1)
go func(i int) {
mutex.Lock()
count++
wg.Done()
mutex.Unlock()
}(i)
}

wg.Wait()

fmt.Printf("test1 花费时间:%d, count的值为:%d \n", time.Now().Sub(t), count)
}

// sync.atomic
func test2() {
var wg sync.WaitGroup
  count := int64(0)
t := time.Now()
for i := 0; i < 10000; i++ {
wg.Add(1)
go func(i int) {
atomic.AddInt64(&count, 1)
wg.Done()
}(i)
}

wg.Wait()

fmt.Printf("test2 花费时间:%d, count的值为:%d \n", time.Now().Sub(t), count)
}
测试结果:

test1 花费时间:4030930, count的值为:10000 

test2 花费时间:3097699, count的值为:10000 


测试结果说明atomic的效率是优于mutex的,为什么建议平常使用mutex,是因为atomic是对内存块加锁,影响系统的整体性能么?



正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

1回答
Xargin 2021-05-27 15:07:28
  1.  atomic 只能保护一个值,而 mutex 可以保护临界区内所有的值

  2.  mutex 是用 atomic 指令结合其它的数据结构来实现的

  3. ​你这里的测试场景就属于简单的计数器场景,这种用 atomic 没啥问题,因为简单呀~

问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师