硬件同步原語其實對應(yīng)的是 Go 語言 atomic 包下的一些原子操作
package main
import (
"fmt"
"sync"
"sync/atomic"
)
func main() {
// 賬戶初始值為0元
var balance int32
balance = int32(0)
done := make(chan bool)
// 執(zhí)行10000次轉(zhuǎn)賬,每次轉(zhuǎn)入1元
count := 10000
//var lock sync.Mutex
for i := 0; i < count; i++ {
// 這里模擬異步并發(fā)轉(zhuǎn)賬
//go transfer(&balance, 1, done, &lock)
//go transferCas(&balance, 1, done)
go transferFaa(&balance, 1, done)
}
// 等待所有轉(zhuǎn)賬都完成
for i := 0; i < count; i++ {
<-done
}
// 打印賬戶余額
fmt.Printf("balance = %d \n", balance)
}
// 轉(zhuǎn)賬服務(wù)
func transfer(balance *int32, amount int, done chan bool, lock *sync.Mutex) {
lock.Lock()
*balance = *balance + int32(amount)
lock.Unlock()
done <- true
}
// CAS原語
func transferCas(balance *int32, amount int, done chan bool) {
for {
oldValue := atomic.LoadInt32(balance)
newValue := oldValue + int32(amount)
if atomic.CompareAndSwapInt32(balance, oldValue, newValue) {
break
}
}
done <- true
}
// FAA原語
func transferFaa(balance *int32, amount int, done chan bool) {
atomic.AddInt32(balance, int32(amount))
done <- true
}