网易首页 > 网易号 > 正文 申请入驻

一百个线程只是读数据,凭什么要排队?

0
分享至

三条门规:读读放行,谁写谁独占写完的数据,读的人必须看得见Java 的账本:一个 long 掰成两半Go 的账本:一个会变负的计数器Python 标准库为啥至今没有读写锁掏出共同套路,再泼一盆冷水

先设想一个特别常见的场景:你有一个全局配置对象,服务一启动,几百个线程都在读它,偶尔有个管理接口进来改一次。

图省事,直接一把互斥锁(Mutex)锁住整个对象。问题跟着来了——两个线程同时读,明明互不干扰,也得一个先进、另一个在门口干等。读的人越多,队排得越长。

谁都没改数据,凭什么要排队?读写锁(ReadWriteLock)就是冲着这笔冤枉账来的。今天把它的门规、底层记账方式,还有它什么时候反而不划算,一次聊透。

读写锁把进门的人分成两种——读者和写者,然后立下三条规矩:

  • •读 + 读:放行。多个读者同时进,互不影响
  • •读 + 写:互斥。写者进场,读者统统靠边
  • •写 + 写:互斥。写者之间照旧排队

写这边的代码和普通锁几乎一个模样,拿经典的 counter++ 举例(Java):



注意,counter++ 之所以没乱,不是这条语句突然变成了原子指令,而是写锁把冲突的临界区串行化了——大家排着队一个个改,自然改不坏。

把它和普通互斥锁摆在一起看,差别就一处:



所以读写锁并不是一把「更强的锁」,它只是把原来唯一的入口拆成两个:读者走共享入口,写者走独占入口,只放开了「读 + 读」这一个口子。

光会放行还不够。读写锁还藏着一条更隐蔽的保证:写者释放写锁之后拿到读锁的人,必须能看到写者写下的所有内容,顺序还不能乱。

还是拿 counter 和 ready 这对老搭档演示:



要是没有这条保证,线程 B 完全可能读到 ready 为 true、counter 却还是 0 的精神分裂现场。这条保证在底层是一条严格的先后链条:



写锁释放到读锁获取之间,有一堵「内存同步」的墙。正是这堵墙,把写者落盘的所有改动,原封不动地推给了后来的读者。

规矩讲完了,底层怎么记账?以 JDK 为例,ReentrantReadWriteLock 底层站在同步框架 AQLS 上,核心状态就是一个 64 位的 state 变量,被掰成了两半用:



读者进来,用 CAS 给高位加一,多人同时成功毫无压力;写者进来,要求整个 state 都没有冲突才放行。而 state 本身被声明为 volatile——第 2 节那条「写完必须被看见」,不是什么魔法,就是靠写锁释放时的 volatile 写、读锁获取时的 volatile 读/CAS这条路径撑起来的。

抢不到锁的人也不空转:进 AQS 的等待队列 park 睡觉,等持锁人释放时被 unpark 叫醒,重新参与竞争。省 CPU,也公平。

Go 的 sync.RWMutex 管的是同一套门规,记账方式却完全是另一路:不是一个变量掰两半,而是内部 Mutex + 原子计数器 + 两个信号量的组合拳。用法长这样:



精髓全在 readerCount 这个计数器上,它靠正负号传递信息:



两种实现看着像双胞胎,脾气差异其实不小:



还有一点两者完全一致:底层都没有发明新的硬件原语,全靠原子指令、缓存一致性、内存序这三样老底子撑着。区别只在软件层怎么组合它们——Java Park 的是线程,Go Park 的是协程,调度器还能腾出手去跑别人。

有意思的是,Python 的 threading 里到今天都没有读写锁。不是做不出来——2009 年就有人提了提案(Issue 8800),讨论了十几年也没进标准库。

原因有两个。第一是GIL 把收益砍没了:传统 CPython 同一时刻只有一个线程在跑 Python 代码,你就算让一百个读者同时进场,它们也只能轮流转,放行了个寂寞(没有 GIL 的 free-threaded 版本正在改变这一点)。

第二是吵不拢:API 该长什么样(一个统一的 RWLock,还是两个独立的锁)?写者排队时新读者放不放行?能不能升级降级?这些语义一旦进标准库就得永久兼容,而社区始终没拿出统一方案。

真要用,一般两条路:找个第三方库,或者用 Lock 加 Condition 自己攒一个——当年那个提案本身就是这么实现的。

把 Java 和 Go 的实现皮扒掉,剩下的骨架是同一套三步:

  • •原子记账:随时维护「几个读者在读、写者在不在」的状态,且每次改动必须原子
  • •冲突睡觉:抢不到就进队列 park,等持锁人释放后唤醒重试,不空转烧 CPU
  • •同步边界:「写锁释放 → 读锁获取」这条边界负责内存同步,让后到的读者看见前面所有写入

但先别急着把项目里的 Mutex 全换成读写锁——它记账是有成本的。读者数量本身就是个共享状态,每个读者进出都要原子加减一次,读的人一多,这个计数器反而成了新的堵点。



一句大实话:读写锁不是「升级版 Mutex」,它是一笔针对特定场景的交换——用更复杂的记账,换读并发。场景不对,这笔买卖就是亏的。

你的项目里有没有那种「明明全是读,却一把大锁堵到底」的地方?评论区聊聊,看看多少人交过这个学费

声明:内容由AI生成

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
小米新机定了,10000mAh + 6.9 英寸!

小米新机定了,10000mAh + 6.9 英寸!

果粉俱乐部
2026-10-17 13:55:06
风光散尽!前首富黄光裕近况曝光,隐居广州豪宅静养

风光散尽!前首富黄光裕近况曝光,隐居广州豪宅静养

静若梨花
2026-08-16 10:37:49
随着泰山5-0大胜浙江,铁人4-0取胜,大连获胜,中超积分榜更新!

随着泰山5-0大胜浙江,铁人4-0取胜,大连获胜,中超积分榜更新!

生活新鲜市
2026-10-18 00:16:21
是否被当成美中期选举替罪羊?泽连斯基沉默十五秒,露出这个表情

是否被当成美中期选举替罪羊?泽连斯基沉默十五秒,露出这个表情

观察者网
2026-10-17 09:52:13
太离谱!“帝王蟹套餐”里没有帝王蟹,商家与代运营双双被罚!

太离谱!“帝王蟹套餐”里没有帝王蟹,商家与代运营双双被罚!

农财宝典水产版
2026-10-15 23:38:26
幂妈应该是近十年以来的内娱第一极品尤物吧

幂妈应该是近十年以来的内娱第一极品尤物吧

小椰的奶奶
2026-10-15 08:55:50
央行重磅定调!房价稳了

央行重磅定调!房价稳了

专业聊房君
2026-10-16 19:51:08
重磅消息!王思雨,李月汝先后加盟山西女篮,WCBA总冠军或已无悬念

重磅消息!王思雨,李月汝先后加盟山西女篮,WCBA总冠军或已无悬念

徐徐解说
2026-10-17 08:12:58
生育率全国第一,中国最愿意生孩子的地方,如今也扛不住了?

生育率全国第一,中国最愿意生孩子的地方,如今也扛不住了?

白米饭怎么吃
2026-10-17 22:43:03
雷克萨斯ES200给到12.59万,曾经30多万落地,如今还剩多少底气!

雷克萨斯ES200给到12.59万,曾经30多万落地,如今还剩多少底气!

沙雕小琳琳
2026-10-17 00:14:28
三任娇妻皆绝色,他却晚景凄凉,一生令人唏嘘

三任娇妻皆绝色,他却晚景凄凉,一生令人唏嘘

唠叨说历史
2026-03-27 16:39:19
2026乌镇戏剧节,“江郎才尽”的黄磊,让所有人见识到了他的江湖地位

2026乌镇戏剧节,“江郎才尽”的黄磊,让所有人见识到了他的江湖地位

娱乐圈十三太保
2026-10-17 19:44:22
8万级!比亚迪新车,正式官宣!

8万级!比亚迪新车,正式官宣!

电动内参
2026-10-17 19:30:36
日本学者公开表示:高市早苗等日本政客参拜“战犯神社”的行为,就好比德国总统或总理给希特勒扫墓一样,从历史角度看完全不可接受

日本学者公开表示:高市早苗等日本政客参拜“战犯神社”的行为,就好比德国总统或总理给希特勒扫墓一样,从历史角度看完全不可接受

吉刻新闻
2026-10-17 20:42:36
林诗栋母亲餐馆遭饭圈冲击:没4块排骨,赢我哥后全家找不着北

林诗栋母亲餐馆遭饭圈冲击:没4块排骨,赢我哥后全家找不着北

冰语历史
2026-10-17 08:46:05
名宿米克尔:C罗作为队长最不应该做的事情是离开球队!

名宿米克尔:C罗作为队长最不应该做的事情是离开球队!

罗吹终结者
2026-10-17 19:59:04
奈飞千人裁员大震荡!首席内容官贝拉・巴贾里亚离职

奈飞千人裁员大震荡!首席内容官贝拉・巴贾里亚离职

环球网资讯
2026-10-17 11:49:11
Fischer:雄鹿已经讨论过交易小凯文-波特和勒韦尔的可能

Fischer:雄鹿已经讨论过交易小凯文-波特和勒韦尔的可能

北青网-北京青年报
2026-10-16 20:17:09
特斯拉降到22万以内,难受的不是对手,是上个月刚提车的人

特斯拉降到22万以内,难受的不是对手,是上个月刚提车的人

沙雕小琳琳
2026-10-17 14:39:48
很多人都搞错了!日本殖民韩国 40 年,真不是没同化成功,当年韩国差点就丢掉自身民族认同了

很多人都搞错了!日本殖民韩国 40 年,真不是没同化成功,当年韩国差点就丢掉自身民族认同了

扶苏聊历史
2026-09-30 11:23:58
2026-10-18 01:47:00
千纸鹤安安
千纸鹤安安
大自然的搬运工
170文章数 3关注度
往期回顾 全部

科技要闻

刘煜辉:99%的黄金分析师报告一钱不值

头条要闻

普京:包围并消灭2000人的乌军集群 这非比寻常

头条要闻

普京:包围并消灭2000人的乌军集群 这非比寻常

体育要闻

升级版杨瀚森再闯难关:当上开拓者第三中锋还得拼

娱乐要闻

庾澄庆罕谈前妻 撕下伊能静仅剩的体面

财经要闻

新一轮大跌源头,找到了!

汽车要闻

星瑞L PLUS限时售价10.97万元起 开启智混3L时代

态度原创

健康
艺术
本地
教育
公开课

看着很健康的人,怎么会突然猝死?

艺术要闻

美到窒息!黛安笔下的午后“印象”,明媚又温柔,看完心情都亮了!

本地新闻

因新荣记出圈,这座浙东小城才是吃货天堂

教育要闻

多地试点直升高中!说明了什么?会有哪些新问题?

公开课

李玫瑾:为什么性格比能力更重要?

无障碍浏览 进入关怀版