Go 如何用硬件同步原語(CAS)替代鎖

硬件同步原語其實對應(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
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容