笔者原来是使用C++开发的,一直以为互斥锁时要是进程间通信中信号量的一个特例。在使用golang开发的时候,一直都很谨慎使用互斥锁,能用原子变量实现的就用原子变量实现。直到今天,测试了下golang标准库中sync.Mutex的性能以后,彻底的感觉到自己以前的无知和自以为是。经过笔者测试,两者的性能几乎没差异,有差异估计就是一点点封装消耗的性能成本。查看标准包中sync.Mutex实现的源码发现是以原子变量为基础实现的
测试代码如下:
type Number struct {
number int64
atomicmutx int64
mutx sync.Mutex
}
func AddNumberMutex() {
testlock.mutx.Lock()
testlock.number = testlock.number + 1
testlock.mutx.Unlock()
}
func AddNumberAtomic() {
for {
if atomic.CompareAndSwapInt64(&testlock.number, 0, 1) {
testlock.number = testlock.number + 1
atomic.StoreInt64(&testlock.number, 0)
break
}
}
}
func BenchmarkMutex(b *testing.B) {
for i := 0; i < b.N; i++ {
AddNumberMutex()
}
}
func BenchmarkAtomic(b *testing.B) {
atomic.StoreInt64(&testlock.number, 0)
for i := 0; i < b.N; i++ {
AddNumberAtomic()
}
}
运行结果如下: