把互斥鎖改為讀寫鎖也很簡(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()
}