2021-02-20:手写代码:读写锁。

福大大架构师每日一题 · · 465 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

福哥答案2021-02-20:

四大方法:读加锁,读解锁,写加锁,写解锁。读加锁里有写加锁,读解锁里有写解锁。代码有写线程饥饿现象,但实现简单。

代码用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()
}

执行结果如下:


在这里插入图片描述

评论


有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:福大大架构师每日一题

查看原文:2021-02-20:手写代码:读写锁。

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

465 次点击  
加入收藏 微博
下一篇:Go HTTP
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传