福哥答案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