2021-02-20:手寫代碼:讀寫鎖。
福哥答案2021-02-20:
四大方法:讀加鎖,讀解鎖,寫加鎖,寫解鎖。讀加鎖里有寫加鎖,讀解鎖里有寫解鎖。代碼有寫線程饑餓現(xiàn)象,但實(shí)現(xiàn)簡(jiǎn)單。
代碼用golang編寫,代碼如下:
```go
package main
import (
? ? "fmt"
? ? "sync"
? ? "time"
)
func main() {
? ? fdd := FddRWMutex{}
? ? go func() {
? ? ? ? i := 0
? ? ? ? for k := 0; k < 5; k++ {
? ? ? ? ? ? go func() {
? ? ? ? ? ? ? ? j := i
? ? ? ? ? ? ? ? i++
? ? ? ? ? ? ? ? fdd.RLock()
? ? ? ? ? ? ? ? fmt.Println("讀操作", j)
? ? ? ? ? ? ? ? time.Sleep(5 * time.Second)
? ? ? ? ? ? ? ? fdd.RUnlock()
? ? ? ? ? ? }()
? ? ? ? ? ? time.Sleep(3 * time.Second)
? ? ? ? }
? ? }()
? ? time.Sleep(1000)
? ? fdd.Lock()
? ? fmt.Println("寫操作------------------------------------------")
? ? fdd.Unlock()
? ? fmt.Println("有寫線程饑餓現(xiàn)象")
}
type FddRWMutex struct {
? ? w? ? ? ? ? ?sync.Mutex
? ? r? ? ? ? ? ?sync.Mutex
? ? readerCount int
}
func (rw *FddRWMutex) RLock() {
? ? rw.r.Lock()
? ? rw.readerCount++
? ? if rw.readerCount == 1 {
? ? ? ? rw.w.Lock()
? ? }
? ? rw.r.Unlock()
}
func (rw *FddRWMutex) RUnlock() {
? ? rw.r.Lock()
? ? rw.readerCount--
? ? if rw.readerCount == 0 {
? ? ? ? rw.w.Unlock()
? ? }
? ? rw.r.Unlock()
}
func (rw *FddRWMutex) Lock() {
? ? rw.w.Lock()
}
func (rw *FddRWMutex) Unlock() {
? ? rw.w.Unlock()
}
```
執(zhí)行結(jié)果如下:
***
[評(píng)論](https://user.qzone.qq.com/3182319461/blog/1613775238)