Java wait()、notify() 的实现与锁有显着不同吗?

2024-01-23

出于好奇,当Java实现wait()和notify()方法时,它们真的只是使用锁吗?即, wait() 获取互斥体,notify() 释放互斥体,notifyAll() 释放所有互斥体(当然在同一个对象中)?

使用wait()和notify()除了比使用锁方便之外还有其他优点吗?

[编辑] 在布莱恩发表评论后,我意识到我自己困惑的是什么:

wait 不加锁,它释放锁并将其传递给正在等待互斥锁的同步语句的其他人,然后等待拥有锁的其他人通知并调用notify,后者将锁传递回原始锁调用 wait 的线程。我想这就是你感到困惑的地方。 – 布莱恩 17 分钟前


其他问题集中在该语言所说的内容上wait and notify是 - 但这似乎不是你的问题所在......你谈论的是互斥体,这是一个实现细节,因此是 JVM 特定的。

所以我们需要选择一个 JVM - 让我们选择 openjdk(源可用here http://openjdk.java.net/projects/jdk6/)。 (最终)处理所有这些东西的代码位于hotspot/src/share/vm/runtime/objectMonitor.cpp.

这维护了两个数据结构 - 等待集和条目集。等待线程被添加到等待集并停放,而尝试获取监视器的线程被添加到条目集然后停放。在notify从等待集中取出一个线程并将其添加到条目集中。当一个线程释放锁时,它会从条目集中取消驻留一个线程(如果有的话)。请注意,这些集合实际上是作为队列(链接列表)实现的,因此是基于 FIFO 进行处理的。

因此,在这种特殊情况下,实现会以类似的方式对待等待对象的监视器并尝试获取对象的监视器。

但这只是一个 JVM 的一种实现(尽管其他人可能会做类似的事情)——所以我们不能依赖它。所以我想问题是你为什么想知道?如果只是好奇那就看一下openjdk的代码,它很有趣。如果您计划在代码中使用此信息...请不要这样做。

UPDATE

我意识到说“公园”并不能告诉我们太多信息。停放线程的代码是特定于平台的(并且在名为的对象中实现)PlatformEvent, which ParkEvent延伸)。在我正在查看的 openjdk 版本中,linux 的 Park 代码可以在以下位置找到hotspot/src/os/linux/vm/os_linux.cpp这称为pthread_mutex_lock(_mutex)...所以回答你的问题yes呼叫等待may获取互斥体在我的机器上。请注意,上面发生的很多事情可能会阻止我们到达这一点。

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

Java wait()、notify() 的实现与锁有显着不同吗? 的相关文章

随机推荐

  • 具有 json 模式的 Kafka jdbc 接收器连接器无法正常工作

    使用最新的 kafka 和 confluence jdbc 接收器连接器 发送一条非常简单的 Json 消息 schema type struct fields type int optional false field id type s
  • 每 1 分钟定期调用一次 AWS Lambda

    我如何定期调用 AWS Lambda 特别是每 1 分钟一次 当前功能允许 Lambdas 设置为5分钟触发 https stackoverflow com a 27382253 358013 但我正在寻找更短的时间间隔 我想过永远运行 L
  • phpass 返回不同的结果

    我只是将我的项目从本地主机放到我的主机上 并使用相同的 phpass 函数 我收到不同的结果 并且返回的字符串的长度也不同 顺便说一句 一切都在本地主机上运行 所以在线时相同的函数返回 false 我想知道可能是什么问题 结果如下 Inpu
  • 如何在 Javascript/Angular JS 中进行舍入——但删除无关紧要的数字

    我的 Javascript 控制器中有以下语句 scope myList 0 1 0 5 0 6666666 我的 AngularJS 模板包含以下行 div i div 这会产生以下 HTML 输出 div 0 div div 1 div
  • JavaFX 一次运行大量倒计时器?

    所以我可以看到几种不同的方法来完成我需要的事情 并且我已经做了很多谷歌 堆栈溢出搜索 但找不到我真正想要的东西 我需要运行多个 倒计时器 我需要在不同时间同时运行大约 6 个 可能最多 10 个 倒计时器 我的主程序上有一个选项卡窗格 我在
  • 强制分配实内存

    是否可以分配大块实内存 512Mb 1Gb 安装了 4Gb 而不将其丢弃到交换区 我的最终目的是释放系统内存 当可用内存接近 0 时 os x 会出现问题 它不会努力将未使用的内存放入交换区 并且尝试获取内存时一切都会变得非常慢 所以 我决
  • PrimeNg 上下文菜单传递数据问题

    我正在使用 PrimeNg 的上下文菜单 v6 0 1 问题是文档不清楚 我也无法在网上找到有关如何将数据传递给命令函数的信息 例如 我在屏幕上渲染了 10 个对象 并且上下文菜单附加到所有这些对象 现在如果我单击菜单项 我想获取渲染上下文
  • Laravel 分页链接与渲染

    我已经使用 Laravel 5 x 几个月了 我只是想知道使用分页时使用链接和渲染之间有什么区别 我做了一些研究 人们以相同的方式使用这两者 假设我有一个从控制器返回的数组变量 我会将分页切成每个视图 5 个项目 public functi
  • PowerShell 脚本不会作为 Windows 计划任务执行

    我有一个 PowerShell 脚本 可以运行 在 Windows 任务计划程序中 我创建了一个要执行的新任务 C Windows System32 WindowsPowerShell v1 0 powershell exe 将参数作为我的
  • mysql 触发器不工作?

    我正在尝试创建一个触发器来根据另一个表上的插入有条件地插入新行 我似乎无法确定语法 到目前为止 这是我所拥有的 DELIMETER CREATE TRIGGER overPricedCar AFTER INSERT ON cars FOR
  • 无法获取Android广告ID

    我正在尝试获取 Android 广告 Id 但找不到正确的方法 事实上 我什至无法获取广告 ID 提供商 isAdvertisingIdProviderAvailable 始终返回 false 我使用的是带有 8 0 PlayStore 的
  • 什么是 Microsoft.Practices.EnterpriseLibrary.Data

    我想知道什么Microsoft Practices EnterpriseLibrary Data dll是以及为什么我们使用这个组件 这个dll有什么好处呢 我想在 3 层架构上创建一个项目 并且很好奇执行 sql 查询的最佳方法是什么 我
  • 使用C++11随机库生成随机数

    正如标题所示 我正在尝试找出一种使用新的 C 11 生成随机数的方法
  • Android:Deviceready 5 秒后尚未触发

    将 Cordova 更新到 v6 4 0 并将 Android 平台更新到 6 0 0 后 我的应用程序不再运行 我得到这个 deviceready has not fired after 5 seconds cordova js 1223
  • NDK/Java项目中的Eclipse CDT C/C++代码补全问题

    我有一个 Android Java 项目 其中包含一些本机 C C 代码 我需要它能够在各种 C 类和函数上完成代码 然而 包含 完整 源代码来源的选项似乎在 Android Java 项目中不可用 有谁知道一种方法 1 欺骗 Eclips
  • 带有 Google 服务帐户主题的generate_access_token()

    在 python 中 我尝试通过服务帐户调用 GMail API委派全域权限 https developers google com identity protocols oauth2 service account authorizing
  • 检索具有 CLSID 的组件的 COM 类工厂错误:8000401a

    从上次开始 我多次收到以下错误 因为我正在使用 Microsoft Word dll 创建 Word 文件 并将其进一步附加到邮件中 Server Error in Application Retrieving the COM class
  • 我如何快速更新其他控制器的用户界面?

    我的应用程序中有几个控制器 当我的应用程序调用一个控制器中的一个函数时 我想更新其他控制器的 UI 我怎样才能做到这一点 class FirstViewController UIViewController func updateUI cl
  • 通过 svnsync 复制 SVN 存储库时如何解决此错误?

    我正在使用 svnsync 复制存储库 并且每次在同一修订版上都会收到此错误 正在传输文件数据 svnsync REPORT of https svn1 avlux net xxxxxx net https svn1 avlux net x
  • Java wait()、notify() 的实现与锁有显着不同吗?

    出于好奇 当Java实现wait 和notify 方法时 它们真的只是使用锁吗 即 wait 获取互斥体 notify 释放互斥体 notifyAll 释放所有互斥体 当然在同一个对象中 使用wait 和notify 除了比使用锁方便之外还