2021-02-20:手写代码:读写锁。
福哥答案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()
}
执行结果如下:
公众号:福大大架构师每日一题
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具