atomic和mutex锁问题
来源:1-9 神奇的内置数据结构
慕少9344774
2021-05-27 14:37:12
曹大,昨天直播中提到了
// 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回答
Xargin
2021-05-27
atomic 只能保护一个值,而 mutex 可以保护临界区内所有的值
mutex 是用 atomic 指令结合其它的数据结构来实现的
你这里的测试场景就属于简单的计数器场景,这种用 atomic 没啥问题,因为简单呀~
相似问题
回答 1
回答 1
回答 1
回答 1
回答 1