2021-02-20:手寫代碼:讀寫鎖。

福哥答案2021-02-20:golang

四大方法:讀加鎖,讀解鎖,寫加鎖,寫解鎖。讀加鎖裏有寫加鎖,讀解鎖裏有寫解鎖。代碼有寫線程飢餓現象,但實現簡單。ide

代碼用golang編寫,代碼以下:線程

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("有寫線程飢餓現象")

}

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()
}

執行結果以下:
在這裏插入圖片描述code


評論blog

相關文章
相關標籤/搜索