go 讀寫鎖

把互斥鎖改為讀寫鎖也很簡(jiǎn)單,只需要把 sync.Mutex 換成 sync.RWMutex ,然后在讀操作的地方改為 RLock(),釋放讀鎖改為 RUnlock():

package main

import (
    "log"
    "sync"
    "time"
)

type Account struct {
    balance float64
    mux     sync.RWMutex // 讀寫鎖
}

//
func (a *Account) Deposit(amount float64) {
    a.mux.Lock() // 寫鎖
    time.Sleep(time.Second * 2)
    a.balance += amount
    a.mux.Unlock() // 釋放寫鎖
}

func (a *Account) Balance() (balance float64) {
    a.mux.RLock() // 讀鎖
    time.Sleep(time.Second * 2)
    balance = a.balance
    a.mux.RUnlock() // 釋放讀鎖
    return balance
}

func main() {

    wg := &sync.WaitGroup{}
    user := &Account{}

    n := 5
    wg.Add(n)
    for i := 1; i <= n; i++ {
        go func() {
            user.Deposit(1000)
            log.Printf("寫:存款: %v", 1000)
            wg.Done()
        }()
    }

    wg.Add(n)
    for i := 1; i <= n; i++ {
        go func() {
            log.Printf("讀:余額: %v", user.Balance())
            wg.Done()
        }()
    }

    wg.Wait()
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

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