You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

写优先读写锁单计数器单锁实现有效性及面试适用性咨询

写优先读写锁实现的有效性与面试适用性分析

一、该实现的有效性分析

这个实现不符合读写锁的核心设计目标,存在严重缺陷,属于无效实现,具体问题如下:

  • 读操作完全串行,失去读写锁的意义:read()方法里,doRead()是在持有锁g的状态下执行的。这意味着所有读请求必须排队依次执行,完全无法实现读写锁允许多个读操作并发执行的核心功能,和普通互斥锁没有区别。
  • 唤醒机制存在漏洞:write()方法最后调用g.notify(),该方法只会唤醒一个等待在锁g上的线程。如果有多个读线程处于等待状态,可能只有一个能被唤醒,其余读线程会一直阻塞,无法继续执行。正确的做法应该是使用notifyAll(),确保所有等待的读线程都能收到唤醒信号并重新检查条件。
  • 写线程逻辑冗余且无必要:write()方法分两次加锁解锁,虽然numOfWriters的修改是线程安全的,但这种拆分锁的写法没有必要,反而可能增加上下文切换的开销。当前逻辑下,写线程确实能优先于读线程执行,但这个“写优先”是建立在读操作完全串行的错误基础上的。

二、面试适用性分析

这个实现不能直接作为正确答案用于面试,但它可以作为“错误案例”来展现你对读写锁原理的理解:

  • 如果你在面试中写出这个实现,面试官大概率会追问其中的问题,这时候你可以主动指出上述缺陷,然后给出修正方案(比如让读操作在获取锁后增加读计数器,释放锁后再执行并发读;写操作等待读计数器归0后再执行等),反而能体现你对读写锁核心逻辑的掌握。
  • 但如果直接将这个实现作为正确的写优先读写锁提交,会暴露你对读写锁并发读的核心特性理解不足,这是面试中的减分项。

附你提供的实现代码:

read() {
    lock g;
    while (num_of_writers > 0) {
        g.wait(); // always yield to writers
    }
    doRead();
    unlock g;
}

write() {
    lock g;
    numOfWriters++; // let all the writers to queue up here
    unlock g;

    lock g;
    doWrite();
    num_of_writers--;
    g.notify();
    unlock g;
}

内容的提问来源于stack exchange,提问作者user1745356

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 10:35:24