等待线程是否重新访问synchronized方法内的代码

2024-03-18

我正在阅读有关线程同步和等待/通知结构的内容tutorial http://docs.oracle.com/javase/tutorial/essential/concurrency/guardmeth.html。它指出

当调用 wait 时,线程释放锁并暂停执行。在将来的某个时间,另一个线程将获取相同的锁并调用 Object.notifyAll,通知所有等待该锁的线程发生了重要的事情。

在第二个线程释放锁一段时间后,第一个线程重新获取锁并通过从 wait 调用返回来恢复。

AFAIK,如果有多个线程可以在第一个线程被唤醒时竞争锁notify,其中任何一个都可以拥有该对象上的锁。我的问题是,如果第一个线程本身重新获取锁,它是否必须从同步方法的开头重新开始(这意味着,它再次在 while 循环检查 wait() 条件之前执行代码)或者它只是暂停在wait() line?

// Does the waiting thread come back here while trying to own the
// lock (competing with others)?
public synchronized notifyJoy() {
    // Some code  => Does this piece of code gets executed again then in case
    // waiting thread restarts its execution from the method after it is notified?
    while (!joy) {
        try {
            // Does the waiting thread stay here while trying to re-acquire
            // the lock?
            wait();
        } catch(InterruptedException e) {}
    }
    // Some other code
}
        

仅当执行该方法的线程完成执行其 run 方法时,方法才会退出,无论是正常返回还是抛出在该 run 方法中未捕获的异常。你的方法的唯一途径not直到上述事情之一发生时才会执行,即 JVM 从您的下面被杀死(使用 java.lang.System.exit,使用 Kill -9 杀死 java 进程等),或者该方法正在运行在 JVM 正在关闭的守护线程中。这里没有什么奇怪的事情发生。等待的线程放弃锁并进入休眠状态,但它不会以某种方式停止执行该方法。

从 wait 调用中唤醒的线程永远不会去任何地方;在线程等待的整个过程中,它仍然处于 wait 方法中。在它离开 wait 方法之前,它首先必须获取它放弃的锁才能开始等待。然后,它需要重新测试需要检查的任何条件,然后才能知道是否继续等待。

这就是为什么受保护的块教程 http://docs.oracle.com/javase/tutorial/essential/concurrency/guardmeth.html告诉你等待必须在循环中完成:

wait 的调用不会返回,直到另一个线程发出可能发生某些特殊事件的通知 - 尽管不一定是该线程正在等待的事件:

public synchronized void guardedJoy() {
    // This guard only loops once for each special event, which may not
    // be the event we're waiting for.
    while(!joy) {
        try {
            wait();
        } catch (InterruptedException e) {}
    }
    System.out.println("Joy and efficiency have been achieved!");
}

注意:始终在循环内调用 wait 来测试正在等待的条件。不要假设中断是针对您正在等待的特定条件的,或者条件仍然为真。

(本教程使用的措辞具有误导性;“中断”一词应该是“通知”。此外,不幸的是,所示的教程代码在没有设置中断标志的情况下吃掉了 InterruptedException,最好让 InterruptedException 从这个方法根本没有捕获它。)

如果线程确实“重新开始”,那么就不需要这个循环;您的代码将从方法的开头开始,获取锁,并测试正在等待的条件。

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

等待线程是否重新访问synchronized方法内的代码 的相关文章

  • H264 字节流到图像文件

    第一次来这里所以要温柔 我已经在给定的 H 264 字节流上工作了几个星期 一般注意事项 字节流不是来自文件 它是从外部源实时提供给我的 字节流使用 Android 的媒体编解码器进行编码 当将流写入扩展名为 H264的文件时 VLC能够正
  • JBoss AS 5 中的共享库应该放在哪里?

    我是 Jboss 新手 但我有多个 Web 应用程序 每个应用程序都使用 spring hibernate 和其他开源库和 portlet 所以基本上现在每个 war 文件都包含这些 jar 文件 如何将这些 jar 移动到一个公共位置 以
  • 在 Android 中绘制一条带有弯曲边缘的线

    I am using canvas drawLine to draw some line in android but the lines are too sharp but i need a curved edges 这里的 1 是我所拥
  • Maven 目标的默认阶段?

    据我了解 在 Maven 中 插件目标可以附加到生命周期阶段 如果没有定义 默认阶段是什么 根据我的经验 这取决于插件的目标 例如 组装 单个 http maven apache org plugins maven assembly plu
  • FFmpeg 不适用于 android 10,直接进入 onFailure(String message) 并显示空消息

    我在我的一个项目中使用 FFmpeg 进行视频压缩 在 Android 10 Google Pixel 3a 上 对于发送执行的任何命令 它会直接进入 onFailure String message 并显示空消息 所以我在我的应用程序 g
  • 更改 JTextPane 的大小

    我是Java新手 刚刚在StackOverflow中找到了这段代码 ResizeTextArea https stackoverflow com questions 9370561 enabling scroll bars when jte
  • 用于防止滥用的 Servlet 过滤器? (DoS、垃圾邮件等)

    我正在寻找一个 Servlet 过滤器库 它可以帮助我保护我们的 Web 服务免受未经授权的使用和 DDoS 攻击 我们的网络服务有 授权客户 因此理想情况下 过滤器将帮助检测未经授权或行为不当的客户 或检测使用同一帐户的多个人 此外 我们
  • MessageDigest MD5 算法未返回我期望的结果

    我脑后的某个东西告诉我 我在这里遗漏了一些明显的东西 我正在将现有的 java 项目与第三方 api 集成 该第三方 api 使用 api 密钥的 md5 哈希进行身份验证 它对我不起作用 在调试过程中我意识到我生成的哈希值与他们提供的示例
  • 如何获取 Android 中临时文件的文件大小?

    如果我使用 openFileOutput 创建并写入临时文件 写入完成后如何获取文件大小 我希望这可以帮助你 File file new File selectedPath int file size Integer parseInt St
  • Java 类:匿名类、嵌套类、私有类

    有人能解释一下Java中匿名类 嵌套类和私有类之间的区别吗 我想知道与每个相关的运行时成本以及每个编译器的方法 这样我就可以掌握哪个最适合用于例如性能 编译器优化的潜力 内存使用以及其他 Java 编码人员的普遍可接受性 我所说的匿名类是指
  • 在多模块项目中访问绑定适配器

    我有一个多模块项目 其中应用程序模块包含我的绑定适配器 而我的功能模块取决于我的应用程序模块 因为它是动态功能模块 应用程序 包含绑定适配器 gt 动态功能模块 存在布局的地方 我在所有模块中启用了数据绑定和 kapt 我无法成功构建应用程
  • NoSuchMethodError:将 Firebase 与应用程序引擎应用程序集成时

    我试图将 firebase 实时数据库与谷歌应用程序引擎应用程序集成 我在调用时收到此错误 gt DatabaseReference ref FirebaseDatabase gt getInstance gt getReference t
  • C++ 中的 Java ArrayList [重复]

    这个问题在这里已经有答案了 在Java中我可以做 List
  • 如何在 Java 中创建要打印到 JFrame 的 JLabels 数组

    我正在尝试制作一系列标签 每个标签都有一个来自函数的不同值 我不知道要使用的标签的确切数量 我的意思是可以打印任意数量的值 请帮我做这件事 很简单 只需一个方法返回一个数组或一些 JLabels 集合 并将它们全部添加到您的 JCompon
  • 为什么 RMI 注册表忽略 java.rmi.server.codebase 属性

    我正在运行 java RMI 的 Hello World 示例 1 我在空文件夹中运行注册表 motta motta laptop tmp rmiregistry 2 我启动 HTTP 服务器以在运行时检索类 下载文件夹包含客户端 服务器的
  • 设计抽象类时是否应该考虑序列化问题?

    一般来说这个问题来自Eclipse建议在抽象类上添加串行版本UID 由于该类是抽象类 因此该类的实例永远不会存在 因此它们永远不会被序列化 只有派生类才会被序列化 所以我的问题是放置一个安全 SuppressWarnings serial
  • BoneCP 和 Derby - 如何正确关闭

    I have BoneCP CONNECTION POOL CONNECTION POOL getConfig setJdbcUrl jdbc derby database shutdown true Connection connecti
  • Java中的媒体播放器库[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在评估用于在 Java 中播放音频 视频的库 它不需要 100 Java Java 与本机库的绑定
  • java数据结构模拟数据树

    我需要帮助定义使用什么方法 我有一个 SOAP 响应 给我一个 xml 文件 我需要在屏幕上显示 3 个相关列表 当您在第一个列表中选择一个项目时 相应的选择将出现在第二个列表中 依此类推 我只对从 xml 流中提取数据后如何有效地组织数据
  • RecyclerView 不调用 onCreateViewHolder 或 onBindView

    没有收到任何错误 所有数据似乎都有效 由于某种原因 没有调用与视图相关的方法 我已确定以下事项 getItemCount 是唯一被调用的适配器方法 并且返回一个正整数值 我知道这将是你们将要查看的区域 构造函数正在被调用 成员变量有效 Pa

随机推荐

  • 使用加法、减法和减半计算三角根

    特定游戏的规则是角色的力量与角色的力量成正比 三角根 https math stackexchange com q 698961 93170角色的经历 例如 15 20经验获得5力量 21 27经验获得6力量 28 35经验获得7力量等等
  • UIWebView 以更有效的方式减少加载时间

    我正在下载多个 html 并将它们作为字符串保存在本地NSArray 然后我用3UIWebViews加载内容 用户总是看到一个UIWebView还有 2 个UIWebViews使用以下方式在后台加载 firstWebView loadHTM
  • 将属性添加到 php 中对象顶部的 stdClass

    当创建一个对象时php用于返回 JSON 是否可以添加一个属性并强制它位于顶部 我想要这个 因为该对象是通过 API 公开的 并且最好在顶部有 id 例如 obj new stdClass obj gt name John obj gt a
  • 如何在 C++ 中限制生成的程序可以使用的内存量

    在我的 C 程序中 我将启动其他程序 如果这些程序使用超过一定量的内存 我希望我的程序杀死它们的进程 那怎么办呢 我可能会使用 execv 来启动程序 假设您使用的是 POSIX 系统 您可以通过调用来限制这一点setrlimit 2 af
  • Linux 上的 .NET core X509Store

    使用 NET Core 2时 Linux中的证书文件位于哪里X509Store 在 Windows 上 可以从管理控制台访问证书certlm msc或与New SelfSignedCertificate在 powershell 中 使用 N
  • 为什么 Xcode 6 将动态链接编辑器库中的自动完成功能保持为 TRUE?

    我仍在学习 Swift 和 iOS 开发 但我一直遇到这个问题 尽管我尝试深入了解一下 但我仍然有点困惑 当我开始打字时trueXcode 6 建议自动完成TRUE 不是世界末日 然而 有一次我决定看看如果我使用会发生什么TRUE结果给了我
  • Spring尤里卡中的instanceid是什么?

    我读到 Eureka 客户端的实例 ID 必须是唯一的 当我们希望运行同一 Eureka 客户端的多个实例时 我们添加此属性 eureka instance instance id spring cloud client hostname
  • 如何依次请求多个权限?

    我的应用程序需要访问CAMERA and 写外部存储权限 一旦我的应用程序加载 我想要求用户依次允许这两个权限 我有这个代码 if ContextCompat checkSelfPermission this Manifest permis
  • 如何仅提取 .tar.gz 成员的文件?

    我的目标是打开包装 tar gz文件 而不是指向该文件的子目录 我的代码基于此question https stackoverflow com questions 4917284 extract files from zip without
  • 图论。如何处理此类问题?我想知道解决这个问题时的逻辑和思考方式。

    求笛卡尔平面上从 0 0 到 n n 的路径数 该路径永远不会高于 y x 线 可以沿着路径进行三种类型的移动 move up i e from i j to i j 1 move to the right i e from i j to
  • Lua中字符串的串联

    在许多语言中 您可以在变量赋值时连接字符串 我有一个使用 Lua 编程语言的场景 我需要将命令的输出附加到现有变量 Lua 中是否有与以下示例等效的功能 其他语言的例子 PERL filename checkbook filename tm
  • C# 带有 new 和 get 整数的构造函数

    这是 Unity 5 5 0 上的结构我对 C 很陌生 不太了解属性和结构 这会在分配期间出现错误this X 我假设您无法更改结构上的值 并且关键字 this 指的是结构的属性 在控制返回给调用者之前 必须完全分配自动实现的属性 Poin
  • 返回php文件中图像的内容?

    我真的不懂 PHP 但我想做一件简单的事情 我从 a 中访问 php 页面 img src myhumbleimage php 我想要从另一个 URL 返回图像 我想出了
  • 什么是布尔标志

    我正在学习 Visual Basic 2010 课程 并试图掌握这个称为 标志 的新术语 我有点理解它与布尔条件有关 我不太明白flag是什么 我看到使用术语 标志 来引用它 我知道当布尔值 条件触发标志时 它会发生一些事情 但旗帜是什么
  • 如何在android sqlite中删除单行

    I have sqlite数据表示在ListView by a CustomListAdapter 单击一行时alert dialogue弹出提示用户删除单行sqlite在我的活动中 private void deleteDialog Al
  • 如何在多 HttpSecurity 情况下返回 http 状态代码而不是登录页面

    我有一个 Spring Boot 应用程序 它通过以下方式提供 HTML 页面服务 还有rest api通过 api 前者需要通过登录表单登录 后者需要HTTP基本身份验证 因此 我配置了两个HttpSecurity部分如下 Configu
  • 以编程方式阻止 Windows 屏幕保护程序启动

    是否有推荐的方法来阻止 Windows 屏幕保护程序启动 我发现的最接近的是本文 http www codeproject com KB cs ScreenSaverControl aspx 但我真正想做的只是告诉 Windows 计算机没
  • Angular 2抛出错误:插座未激活

    我已经设置了我的应用程序 以便我有一个Recipe Book其中有一个列表Recipies当我点击食谱时 它会显示Recipe Details在嵌套路由中 然后 它还有一个按钮 单击该按钮会将成分加载到嵌套路径中Recipes Detail
  • 如何在 Vim 中普遍使用相对行号

    我喜欢 Vim 7 3 中的相对行编号功能 但我很难让它普遍适用 对于许多文件 行编号会恢复为绝对模式 即使我已指定 set rnu in my vimrc文件 知道是什么原因造成的吗 我在 OSX 10 6 上使用 Vim 7 3 以及
  • 等待线程是否重新访问synchronized方法内的代码

    我正在阅读有关线程同步和等待 通知结构的内容tutorial http docs oracle com javase tutorial essential concurrency guardmeth html 它指出 当调用 wait 时