为什么我们需要在同一个对象上同步才能使notify()起作用

2023-11-21

我正在得到java.lang.IllegalMonitorStateException。我提到this问题,它解决了我的问题。第一个答案是

To be able to call notify() you need to synchronize on the same object.

synchronized (someObject) {
    someObject.wait();
}

/* different thread / object */
synchronized (someObject) {
    someObject.notify();
}  

我的问题是为什么我们需要在同一个对象上同步以及它是如何工作的?

据我的理解,当我们说

synchronized (someObject) {
    someObject.wait();
}

我们获得了对象 someObject 的锁,然后调用它的 wait() 。现在另一个线程如何获得同一个对象的锁定以对其调用notify()?我缺少什么?


为什么notify也需要锁吗?

想象一下这个场景:

synchronized(x){
        while(x.count < 4) {
          x.wait();
          //...
        }
}

现在想象一下notify其他地方没有任何锁:

//...
println(x.count); // print 3
x.count++;
if(count == 4) 
  x.notify()
//...

乍一看,整体听起来总是按预期工作。
然而,想象一下这种竞争条件:

//Thread1 enters here
synchronized(x){
     while(x.count < 4) {
         //condition is judged true and thread1 is about to wait 
         //..but..ohh!! Thread2 is prioritized just now !
         //Thread2, acting on notify block side, notices that with its current count incrementation, 
         //count increases to 4 and therefore a notify is sent.... 
         //but...but x is expected to wait now !!! for nothing maybe indefinitely !
       x.wait();
       //maybe block here indefinitely waiting for a notify that already occurred!
     }
}

如果我们有办法告诉notify side:

话题一:“嗯..notify,你很可爱,但我才刚刚开始评估我的状况(x.count < 4)为真,所以请...不要愚蠢地立即发送您期望的通知(在我将状态设置为等待之前),否则,我等待已经过去的事情将是荒谬的”

线程 2:“好吧好吧......我会在我的逻辑周围加锁以保持一致,以便我发送通知after您的等待调用释放了我们的共享锁,因此您将收到此通知,允许退出等待状态;)”

因此,始终在notify一边,在被wait持有的同一个对象上,以避免这种情况,让关系始终一致。

=> 导致的逻辑notify和导致的逻辑wait永远不应该重叠。

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

为什么我们需要在同一个对象上同步才能使notify()起作用 的相关文章

  • Zuul不转发请求到其他微服务

    我正在使用 Spring Boot 微服务 我已经配置了 eureka zuul 代理和另一个微服务 帐户 如果我直接从帐户拨打电话 则工作正常 帐户和 zuul 服务器都显示在 eureka 上 当我尝试使用 zuul 代理进行访问时 它
  • Java 访问被拒绝

    C Program Files x86 Java jdk1 6 0 17 bin gt javac VendingMachine java VendingMachine java 27 error while writing Vending
  • Java 中具有级别顺序插入的完整二叉搜索树

    我们接到一个任务 需要编码 二叉搜索树 那个树has to be complete not perfect 这意味着所有不在最低级别或次低级别的节点都应该有 2 个子节点 而最低级别的节点应尽可能远离左侧 我们需要插入到树中等级顺序 所以如
  • Java泛型类型要么扩展要么是父类

    我正在寻找一些如下所示的代码 public class Parent
  • Android - 检测电容式触摸屏上的触摸压力?

    我听说过 MotionEvent e float press e getPressure 但这只会在没有触摸时返回 0 当我的手指触摸屏幕时返回 1 是否可以找到手指在触摸电容屏上施加的压力值 或者我的预感是否正确 即这只适用于电阻屏幕 M
  • 为 Nimbus 外观设计简单的单元渲染器

    我有一个简单的单元格渲染器 它由一些组成JLabels 渲染器本身扩展JPanel 并且我正在尝试让它在 Nimbus 的外观和感觉中合理地渲染 基本上发生的事情是在lighter行 正如 Nimbus 所具有的交替行着色 我的特定单元格渲
  • 在 Spring Security 中创建自定义 PostAuthorize 方法

    我正在尝试创建一个自定义方法 用于预 后授权调用 如下所示 public class CustomLSecurityExpressionHandler extends DefaultMethodSecurityExpressionHandl
  • 高负载应用程序的数据库可扩展性?

    我见过一些应用程序拥有集群 Web 服务器 例如 10 到 20 个服务器 以具有可扩展性 可以在其中分发 在网络服务器之间加载 但我总是看到所有网络服务器都使用单个数据库 现在考虑任何电子商务或铁路 Web 应用程序 其中有数百万用户在任
  • 请放心,如何在 POST 请求后从响应正文中提取生成的令牌并将其设置到标头

    执行任何请求 我需要执行身份验证POST请求正文 username somename password somepass 标头Content Type application json这给了我一个带有生成令牌的响应 我需要将其粘贴为第二个标
  • 如何将多个值存储到一个键(java)

    我搜索一个可以存储多个键值对的数据结构 数据基本上是这样的 1 value 1 2 value 2 于是我想到了使用HashMap 遗憾的是 这对我不起作用 因为一个键可能会出现多个值 在上面的例子中 1 value 2 可能是另一个条目
  • 如何从网上获取源代码?

    我正在尝试从 Web 获取 HTML 源代码 我尝试这样做 u new URL url URLConnection con u openConnection con setRequestProperty User Agent Mozilla
  • 如何用Java捕获音频数据

    我想访问我的麦克风用 Java 录制的音频数据 我该怎么做呢 我的目标是保存录制的音频数据并同时向用户播放 如果您不需要 JMF 中的任何附加功能 我会避免使用它 因为开发已经停止 最后一个版本是 2004 年 它与 Java 6 存在兼容
  • C++:Linux平台上的线程同步场景

    我正在为 Linux 平台实现多线程 C 程序 其中我需要类似于 WaitForMultipleObjects 的功能 在搜索解决方案时 我发现有一些文章描述了如何在 Linux 中实现 WaitForMultipleObjects 功能
  • Java 8 中函数类型全等 lambda 表达式的用法

    我对 的定义和用法感到困惑 Stream collect Supplier
  • 错误:找不到符号 ArrayList

    我正在尝试创建某种列表来存储数组 表 中的值 我在这里使用数组列表 但我应该使用列表吗 但是 每次我尝试编译时 它都会引发以下错误 找不到标志 符号 ArrayList类 位置 玩家类 TablePlayer 代码如下 public cla
  • 解析XML文件以获取所有命名空间信息

    我希望能够从给定的 XML 文件中获取所有名称空间信息 例如 如果输入 XML 文件类似于
  • 用 Java 编写“漂亮”代码的标准? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • JavaFX颜色选择器的语言

    有没有办法改变语言ColorPicker的文本 例如 自定义颜色 当前颜色 新颜色 色相 饱和度 亮度 不透明度 保存 使用 取消 编辑 以下答案适合那些需要更多内容的人exotic语言 如果您使用其中之一 de es fr it ja k
  • java银行程序帐户ID不上去?

    每次创建银行帐户时 帐户 ID 都应增加 1 但每次我尝试提取 Id 时 我只会得到帐户 ID 为 0 任何建议 因为我完全按照我学习的书中的方式进行操作而且它仍然没有更新 帐户构造函数 public class BankAccount p
  • 应用程序中 GC 长时间暂停

    我当前运行的应用程序需要最大堆大小为 16GB 目前我使用以下标志来处理垃圾收集 XX UseParNewGC XX UseConcMarkSweepGC XX CMSInitiatingOccupancyFraction 50 XX Di

随机推荐

  • 限制引导样式的范围

    如何将 Bootstrap 限制为 div 的范围 我需要将 Bootstrap 样式表嵌套在 ExtJS 应用程序中以用于特定的 div 并且两者都会发生冲突 因为它们需要自己的正文 ul li a 等 我试图避免手动编辑 bootstr
  • 如何在 UITextView 中找到光标的像素位置?

    我正在为 iPad 开发一个简单的写作应用程序 我正在尝试计算光标的像素位置UITextView 我花了几周的时间来设计这个 但我仍然不知道该怎么做 在 stackoverflow 中 Tony 编写了一种很好的算法来查找光标的像素位置 U
  • Matlab/Octave 1-of-K 表示

    我有一个大小为 5000 1 矩阵 的 y 其中包含 1 到 10 之间的整数 我想将这些索引扩展为 1 of 10 向量 即 y 包含 1 2 3 我希望它 扩展 为 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
  • 如何在R中叠加密度图?

    我想使用 R 在同一设备上叠加 2 个密度图 我该怎么做 我在网上搜索但没有找到任何明显的解决方案 我的想法是从文本文件 列 中读取数据 然后使用 plot density MyData Column1 plot density MyDat
  • 主机名无效 - 无法从 Android 模拟器连接 IIS Express

    我正在尝试从 Android 应用程序连接本地 IIS Express 托管的 WCF 服务 目前 我正在模拟器上对此进行测试 该服务的本地 URL 是http locahost 40000 api Authenticate 我知道 loc
  • 如何更改 PowerShell 提示符以仅显示父目录和当前目录?

    我想缩短我的 PowerShell 提示符 以便它只显示父目录和当前目录 例如 如果密码是 C Users ndunn OneDrive Documents Webucator ClassFiles python basics Demos
  • BCP 到 CSV 文件,数据中包含逗号

    我有一个正在调用存储过程的 BCP 进程 通常 我一直在执行此存储过程并将数据复制到 Excel 工作表 我将所有列指定为文本并将其另存为 CSV 我需要自动化这项工作 并且一直在使用 BCP 命令 但到目前为止遇到了问题 我拥有的数据中有
  • 当我在“救援”中“重试”时,Ruby 没有“确保”

    考虑这个开始救援确保块 attempts 0 begin make service call rescue Exception retry unless attempts gt 2 exit 1 ensure attemps 1 end 如
  • JUnit - 我应该将 null 分配给在 setup 中实例化的tearDown 中的资源吗?

    我现在正在读一本关于 JUnit 的书 作者建议在tearDown 方法中清空资源 为什么 这不是GC的工作吗 它真的会造成任何伤害吗 让我们想想这样的例子 public class SomeTest extends TestCase Ve
  • 如何使用 MongoDB $addToSet 对象到数组并 $sort ?

    我需要将一个对象添加到 MongoDB 集合文档中的数组中 插入该对象后 我需要确保所有数组的元素都按其属性之一排序 由于我需要数组中的对象是唯一的 所以我使用 addToSet代替 push 这是我正在尝试的一个例子 db perros
  • UncaughtExceptionHandler 中抛出的错误会被吞掉吗?

    Thread UncaughtExceptionHandler声明当处理未捕获异常的方法本身抛出异常时 该异常将被忽略 void 未捕获的异常 线程 t 可抛出 e 当给定线程由于给定原因而终止时调用的方法 未捕获的异常 该方法抛出的任何异
  • json newtonsoft :反序列化包含字符串列表的对象

    我对这个 json 有以下问题 EVTS EVT ID 123456 KEY1 somekey CATEG cat1 cat2 cat3 和这个 C 类 public class myClass public string ID get s
  • 如何避免Fabric CA出现单点故障?

    如果我理解正确的话 fabric 区块链网络中的每个对等点 以某种方式通过八卦互连 将仅接受来自其他对等点的传入连接 前提是它们使用带有 Fabric CA 签名的公钥的 HTTPS 连接 那是对的吗 因此 根据我的理解 Root CA 成
  • 您将如何以编程方式测试文件是否有病毒? [关闭]

    Closed 这个问题需要多问focused 目前不接受答案 我想以编程方式测试文件是否有病毒 我知道这个线程 我认为这没有得到满意的答案 但我不是在这里寻找 API 任何可以测试文件的解决方法都可以 当然 API 可能是最好的解决方案 我
  • 为什么没有 ICloneable

    是否有特殊原因导致通用ICloneable
  • 将 matplotlib 图表嵌入到 Qt/C++ 应用程序中

    我正在 Qt C 中开发面向数学的 GUI 应用程序 并希望嵌入 Python 脚本 包括 NumPy 和 Matplotlib 使用 Python C API 我最终成功运行了一个脚本 从 Python 变量中检索值 包括 NumPy 数
  • Android语音识别权限不足(错误代码9)

    我正在尝试在没有标准对话框的情况下实现语音识别 它与对话框一起工作正常 当我尝试开始监听时 我收到错误代码 9 我的设备是 LG G Stylo 运行 Android 6 0 显现
  • 将 Gif 图像转换为 NSData

    我的相册里有一张 gif 图像 当我使用UIImagePickerController要选择该图像 我需要将图像转换为NSData用于存储 早些时候 我用过 NSData thumbData UIImageJPEGRepresentatio
  • pathos.multiprocessing 有星图吗?

    执行下面的代码时出现错误 问题似乎是map不支持接受多个输入的函数 就像 python 内置函数一样multiprocessing包裹 但是内置的包里有一个starmap这解决了这个问题 做pathos multiprocessing有相同
  • 为什么我们需要在同一个对象上同步才能使notify()起作用

    我正在得到java lang IllegalMonitorStateException 我提到this问题 它解决了我的问题 第一个答案是 To be able to call notify you need to synchronize