锁实现方式
package main
import (
"fmt"
"time"
"sync"
"sync/atomic"
)
func main() {
var balance int32 = 0
count := 100000000
t1 := time.Now()
transLock := sync.Mutex{}
wg := sync.WaitGroup{}
for i:=0;i<count;i++ {
wg.Add(1)
go transferLock(&balance,&transLock,&wg)//3.1518197s|32.0352204s
}
wg.Wait()
elapsed := time.Since(t1)
fmt.Println(" 耗时: ", elapsed)
fmt.Println("balance:",balance)
}
func transferLock(balance *int32, lock *sync.Mutex,wg *sync.WaitGroup) {
defer wg.Done()
lock.Lock()
*balance = *balance +1
lock.Unlock()
}
CAS实现方式 : 先读取数据,再计算,再更新
package main
import (
"fmt"
"time"
"sync"
"sync/atomic"
)
func main() {
var balance int32 = 0
count := 100000000
t1 := time.Now()
wg := sync.WaitGroup{}
for i:=0;i<count;i++ {
wg.Add(1)
go transferCAS(&balance,&wg)//3.126052s|31.8275625s
}
wg.Wait()
elapsed := time.Since(t1)
fmt.Println(" 耗时: ", elapsed)
fmt.Println("balance:",balance)
}
func transferCAS(balance *int32,wg *sync.WaitGroup) {
defer wg.Done()
for {
//atomic原子操作
oldbalance := atomic.LoadInt32(balance)
newbalance := oldbalance + 1
if atomic.CompareAndSwapInt32(balance, oldbalance, newbalance) {
break
}
}
}
FAA实现方式:直接更新
package main
import (
"fmt"
"time"
"sync"
"sync/atomic"
)
func main() {
var balance int32 = 0
count := 100000000
t1 := time.Now()
wg := sync.WaitGroup{}
for i:=0;i<count;i++ {
wg.Add(1)
go transferFAA(&balance,&wg)//3.1998921s|31.6946224s
}
wg.Wait()
elapsed := time.Since(t1)
fmt.Println(" 耗时: ", elapsed)
fmt.Println("balance:",balance)
}
func transferFAA(balance *int32,wg *sync.WaitGroup) {
defer wg.Done()
atomic.AddInt32(balance,1)
}