ReentrantReadWriteLock 中的读锁和写锁是否有某种关联?

2024-04-02

请详细解释一下合同。我不知道里面是否包含两把锁ReentrantReadWriteLock有某种关系吗?或者这些只是两把普通锁的捆绑?


它允许多个线程同时读取资源,但要求线程等待独占锁才能写入资源。

规则是:

  • 多个读者可以同时共享资源。如果你有一个 读锁,您可以安全地获取另一个读锁。最大值 共享锁的数量为 1111 1111 1111 1111
  • 如果您有读锁,则无法获取写锁
  • 如果您有写锁,则无法在任何其他线程中获取读锁。
  • 当没有活跃的写入者时,读取者可以访问资源 任何其他线程。
  • 如果你有一个写锁,你可以在 同一个线程。一个线程可以拥有的最大独占锁数量 自己的是 1111 1111 1111 1111
  • 当没有其他读取器或写入器(来自不同线程)处于活动状态时,写入器可以访问资源。
  • 比起读者更喜欢作家。也就是说,如果写入者正在等待锁,则不允许其他线程的新读取者访问该资源。现有的读者可以继续使用该资源,直到他们释放锁。这可以防止所谓的“作家饥饿”。
  • 允许通过获取从写锁降级为读锁 写锁,然后读锁,然后释放写锁。 然而,从读锁升级到写锁并不是 可能的。

在内部,锁定状态 (c) 由 int 值维护。在这种情况下,由于我们有读锁和写锁,因此它在逻辑上分为两个短:较低的表示独占(写入者)锁持有计数,较高的表示共享(读取者)持有计数。

假设锁的当前状态是 c= xxxx xxxx xxxx xxxx yyyy yyyy yyyy yyyy 那么 读卡器锁数量为高位 xxxx xxxx xxxx xxxx

写锁数量为低位 yyyy yyyy yyyy yyyy

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ReentrantReadWriteLock 中的读锁和写锁是否有某种关联? 的相关文章

随机推荐

  • 检测 Asp.net 上的浏览​​器关闭

    我想在注销时执行一些功能 如果用户直接关闭浏览器 则需要执行相同的功能 我们无法在页面卸载上执行此操作 因为我的网站中有 100 多个页面 因为这将在每个页面的重定向上起作用页 谢谢
  • 操作员 '??'不能应用于“System.DateTime”类型的操作数

    我收到以下错误 Operator cannot be applied to operands of type System DateTime foreach EndServReward r in reward if con State Co
  • R TwitteR 包授权错误

    我正在关注最新更新推特主页 https github com geoffjentry twitteR 我无法通过授权流程 library devtools install github twitteR username geoffjentr
  • php 中 eregi() 的替代方案 [重复]

    这个问题在这里已经有答案了 因此 我在邮件脚本中使用了 eregi 但最近 我收到该函数已弃用的错误 那么 替换以下代码的最简单方法是什么 if eregi A Z0 9 A Z0 9 A Z 2 4 trim POST email 任何帮
  • Pandas:如何创建年周变量?

    我有一个带有日期时间的数据框 dates pd date range 9 25 2010 periods 10 freq D df pd DataFrame col dates df col pd to datetime df col df
  • 连接无序线段

    我的算法生成一个 通常 数千条线段 全是二维 的列表 我需要将它们连接成大型折线 这些生成的折线可能是闭合的或开放的 但它们永远不会自相交 线段没有方向 即可能需要翻转线段才能将其连接到相邻线段 找到这些折线的极快方法是什么 我必须实时执行
  • 什么是可以轻松集成到现有应用程序的优秀 Ruby on Rails 论坛?

    什么是可以轻松集成到现有应用程序的优秀开源 RoR 3 论坛 可选功能 OpenID 支持 Haml SCSS 模板 支持表情符号 YouTube 图像等 我可能会对其进行很多更改 而且我对 Ruby 的了解仍然很弱 因此干净的 带注释的代
  • 如何反转 sed 输出?

    我正在阅读大约 500 个字符的行 我怎样才能让 sed 不用某些东西替换该字符串 而是用某些东西替换该行的其余部分 简而言之 我想删除指定字符串周围的所有文本 使用 awk 删除列不起作用 因为匹配的字符串前后有不确定数量的字符 有任何想
  • 如何将 JFreechart 添加到面板?

    我尝试寻找答案来使其正常工作 但没有成功 我快要失去理智了 所以这是我的问题 我最近下载了 JFreeChart 来创建图表并在我的 GUI 中实现它们 这是我想要插入图形的 GUI 和面板 以白色标记 报告1 http www freei
  • Fiddler 测试 API Post 传递 [Frombody] 类

    我有一个非常简单的 C APIController 名为 TestController 其 API 方法如下 HttpPost public string HelloWorld FromBody Testing t return t Nam
  • 组合框架更新 UI 无法正常工作

    我想尝试Combine框架 使用非常简单 按aUIButton 并更新UILabel 我的想法是 添加发布者 Published var cacheText String 订阅 cacheText assign to text on cac
  • 无法在类似字节的对象上使用字符串模式 - python 的重新错误[重复]

    这个问题在这里已经有答案了 我正在做 python 挑战并试图熟悉 python 所以在不看答案的情况下 我尝试使用 python 的 url 阅读器来读取 html 然后找到所需的字母 但是在下面的代码中我收到一个错误 最初是 pytho
  • 为 Windows 服务创建 MSI 安装程序

    我在 Visual Studio 2008 中有一个 Windows 服务项目 我还添加了安装和部署项目 不幸的是 当我安装它时 该服务没有显示在服务 MMC 管理单元中 我已经将 ProjectInstaller 添加到服务项目中 并且已
  • 使用APNS发送远程推送通知的送达报告 - IOS

    我正在使用 APNS 发送远程推送通知 要求是当通知发送给应用程序用户时 即使用户没有点击通知甚至没有看到通知 根据通知 id i 将发送收据发送到 Web 服务器 即调用 Web 服务 已收到 APNS 没有提供交付报告 他们是 APNS
  • 当数据依赖于日期时间时,在数据库中保存日期时间和时区信息的最佳实践

    关于在数据库中保存日期时间和时区信息有很多问题 但更多的是总体水平 这里我想讲一个具体的案例 系统规格 我们有一个订单系统数据库 它是一个多租户系统 租户可以使用任意时区 它是任意的 但每个租户只有一个时区 保存在租户表中一次并且永不更改
  • 为什么 int[] a = new int[1] 而不是 int a ?

    这段代码中是否有一些我在 java 中看不到的隐藏含义 怎么可能有用呢 int a new int 1 不仅仅是 int a 因为从我的角度来看这是一样的 int a 定义一个原始 int int a new int 1 定义一个有空间容纳
  • 如何在 C# 中为自定义 DataTemplateSelector 获取 DataTemplate 的 {x:DataType}

    我正在写一个自定义DataTemplateSelector for a ComboBox控件 我需要用它来显示不同的DateTemplates对于不同类型的物体 在封闭和开放模式下ComboBox 这是DataTemplateSelecto
  • SQL触发器更新另一个表

    我有一个 Maximo 数据库 其表结构无法更改 我希望在创建或更新时将主要电子邮件地址复制到 PERSON 表中 以下结构描述了 PERSON 表和 EMAIL 表 人员表 PERSONID EMAIL other irrelevant
  • 刷新页面后将焦点设置在网页上而不是 Firefox 调试器上

    我正在使用默认的 Firefox Web 开发人员工具 火狐浏览器 20 0 Mac OS X 10 7 如果我打开开发人员工具的调试器面板 但未聚焦 并刷新页面 焦点将转到调试器面板而不是刷新的页面 我可以将焦点设置为转到刷新的页面吗 如
  • ReentrantReadWriteLock 中的读锁和写锁是否有某种关联?

    请详细解释一下合同 我不知道里面是否包含两把锁ReentrantReadWriteLock有某种关系吗 或者这些只是两把普通锁的捆绑 它允许多个线程同时读取资源 但要求线程等待独占锁才能写入资源 规则是 多个读者可以同时共享资源 如果你有一