惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

IT之家
IT之家
H
Help Net Security
GbyAI
GbyAI
博客园_首页
G
Google Developers Blog
Microsoft Security Blog
Microsoft Security Blog
博客园 - 【当耐特】
月光博客
月光博客
美团技术团队
B
Blog RSS Feed
博客园 - 三生石上(FineUI控件)
WordPress大学
WordPress大学
博客园 - 叶小钗
有赞技术团队
有赞技术团队
T
The Blog of Author Tim Ferriss
Engineering at Meta
Engineering at Meta
Google DeepMind News
Google DeepMind News
Y
Y Combinator Blog
宝玉的分享
宝玉的分享
Microsoft Azure Blog
Microsoft Azure Blog
罗磊的独立博客
云风的 BLOG
云风的 BLOG
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
P
Proofpoint News Feed

OhYee 博客

小鹏辅助驾驶测评|OhYee 博客 小鹏非支持手机开启自动解锁|OhYee 博客 使用函数计算实现 301 重定向|OhYee 博客 针对 HTML 内容使用 Ant Design 图片弹框|OhYee 博客 博客进程泄露及僵尸进程解决|OhYee 博客 蓝易云服务器体验|OhYee 博客 SSH 调起本地 VSCode|OhYee 博客 【2022 秋招内推】阿里云后端研发工程师|OhYee 博客 使用函数计算获取 IP 地址信息|OhYee 博客 正确获取客户端 IP/HTTP Header 也可能重复|OhYee 博客 评测 Oculus Quest2 及 BigScreen|OhYee 博客 NextJS 热重载保留状态|OhYee 博客 如何优雅地贴 gist 代码|OhYee 博客 Linux 精细化文件权限|OhYee 博客 VSCode 容器开发环境|OhYee 博客 Clash 的不兼容更新排查|OhYee 博客 Zeek 导出 PCAP|OhYee 博客 记一次 ssh 配置问题|OhYee 博客 Git Commit 规范化工具|OhYee 博客 谈谈《星之卡比-探索发现》|OhYee 博客 VSCode 快捷键绑定 Shell 命令|OhYee 博客 ASN.1 语法及 X.509 证书格式解析解析|OhYee 博客 腾讯企业邮箱忽略 MX 记录发信|OhYee 博客 Chrome/Edge 标签组插件|OhYee 博客 【应届内推】阿里云后端研发工程师|OhYee 博客 损坏的 Typecho 备份处理为 JSON|OhYee 博客 VS Code VIM 插件高效使用|OhYee 博客 SSH 正反向代理|OhYee 博客 Let's Encrypt 根证书过期引发的问题|OhYee 博客 OpenWRT 忽略内核依赖|OhYee 博客
从读锁切换至写锁|OhYee 博客
2021-07-23 · via OhYee 博客

从读锁切换至写锁

为什么在读锁切换写锁时需要重新检查状态

这是一篇最后编辑于 5 年前 的文章,其内容可能与目前实际情况差异较大,请注意甄别

从读锁切换至写锁

如果要实现一个多线程下,大部分是读操作的场景,使用读写锁(sync.RWMutex)往往比互斥锁(sync.Mutex)拥有更好的性能。这一点是毋庸置疑的,因为在读锁可以有多个线程共享,只需要在修改数据时保证其他线程阻塞即可。

这也就引入一个新的问题:在获取到写锁的情况下,自然只有当前的线程拥有执行权限,即使去做读操作也不会有任何问题。但是在获取到读锁的情况下,如果需要进行写入,那么可能会有一点小问题。

试想下述流程

  1. 获取读锁
  2. 检查对应项是否存在
  3. 对应项不存在
  4. 释放读锁
  5. 获取写锁
  6. 初始化对应项
  7. 释放写锁

在单线程的逻辑上,似乎这里没有任何问题,但是在多线程逻辑下,2~4 中的任何一个过程,执行权限都有可能被其他线程获取,并且修改对应的内容。在当前线程初始化时,实际上是丢掉了其他线程的操作数据.

为了避免这个问题,通常在获取读锁后,需要重新进行一次检查,如果还是发现没有被初始化时,才进行初始化,否则执行更新流程。


在阅读代码时曾经见过进行两次检查的场景,但是当时一直没有太明白。当自己因为类似的问题导致数据不完整时,突然明白了原因。