notify可以多次唤醒同一个线程吗?

2023-11-21

想象一下 Java 中有一个典型的生产者-消费者模式。为了提高效率,你想使用notify()并不是notifyAll()当一个新元素被添加到队列中时。如果两个生产者线程调用notify,是否可以保证两个不同的等待消费者线程会被唤醒?或者可以是两个notify()彼此紧随其后触发会导致同一个消费者线程排队等待唤醒两次?我找不到描述其具体工作原理的 API 部分。 java是否有一些原子内部操作可以一次性唤醒线程?

如果只有一个消费者在等待,那么第二个通知就会丢失,这没有问题。


我的回答有一些具体实施的信息。它基于我对 Sun JVM 和其他线程库行为的工作知识。

如果两个生产者线程调用notify,是否可以保证两个不同的等待消费者线程会被唤醒?

不它不是。无法保证会有任何消费者被唤醒。可以保证的是,如果有 2 个线程正在等待,那么 2不同的线程将被放入运行队列。

或者可以是两个notify()彼此很快触发会导致同一个消费者线程排队等待唤醒两次?

第二号notify()调用不会导致同一个消费者线程排队两次。然而,它可能会导致一个线程被唤醒,并且可能没有其他线程在等待,因此第二个线程notify()调用可能什么也不做。当然,线程可能已被唤醒,然后立即返回等待,因此获得第二个notify()那样称呼,但我认为这不是您所要求的。

java是否有一些原子内部操作可以一次性唤醒线程?

是的。这Thread代码有许多同步点。一旦线程被通知,它就会被移出wait队列。未来致电notify()将调查wait队列并没有找到线程。

多一个重要的观点。对于生产者/消费者模型,始终确保您正在测试条件while环形。原因是存在竞争条件,消费者在锁上被阻塞但不等待条件。

 synchronized (workQueue) {
     // you must do a while here
     while (workQueue.isEmpty()) {
         workQueue.wait();
     }
     workQueue.remove();
 }

Consumer1可能正在等待workQueue. Consumer2可能会被阻止在synchronized但在运行队列中。如果有东西被放入workQueue and workQueue.notify()叫做。Consumer2现在被放入运行队列但是behind Consumer1谁先到。这是一个常见的实现。所以Consumer1进入 a 将项目从workQueue that Consumer2被通知。Consumer2必须再次测试workQueue否则为空remove()会抛出,因为队列再次为空。请参阅此处比赛的更多细节.

同样重要的是要认识到虚假唤醒已被记录下来,因此while循环可防止线程在没有循环的情况下被唤醒wait() call.

综上所述,如果您可以通过使用减少生产者/消费者代码BlockingQueue正如其他答案中所建议的那样,那么您应该这样做。这BlockingQueue代码已经解决了所有这些问题。

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

notify可以多次唤醒同一个线程吗? 的相关文章

  • 不同帐户上的 Spring Boot、JmsListener 和 SQS 队列

    我正在尝试开发一个 Spring Boot 1 5 应用程序 该应用程序需要侦听来自两个不同 AWS 帐户的 SQS 队列 是否可以使用 JmsListener 注解创建监听器 我已检查权限是否正确 我可以使用 getQueueUrl 获取
  • Mockito:如何通过模拟测试我的服务?

    我是模拟测试新手 我想测试我的服务方法CorrectionService correctPerson Long personId 实现尚未编写 但这就是它将执行的操作 CorrectionService将调用一个方法AddressDAO这将
  • 在内存中使用 byte[] 创建 zip 文件。 Zip 文件总是损坏

    我创建的 zip 文件有问题 我正在使用 Java 7 我尝试从字节数组创建一个 zip 文件 其中包含两个或多个 Excel 文件 应用程序始终完成 没有任何异常 所以 我以为一切都好 当我尝试打开 zip 文件后 Windows 7 出
  • 来自 dll 的 Java 调用函数

    我有这个 python 脚本导入zkemkeeperdll 并连接到考勤设备 ZKTeco 这是我正在使用的脚本 from win32com client import Dispatch zk Dispatch zkemkeeper ZKE
  • Java 公历日历更改时区

    我正在尝试设置 HOUR OF DAY 字段并更改 GregorianCalendar 日期对象的时区 GregorianCalendar date new GregorianCalendar TimeZone getTimeZone GM
  • Eclipse Maven Spring 项目 - 错误

    I need help with an error which make me crazy I started to study Java EE and I am going through tutorial on youtube Ever
  • 帮助将图像从 Servlet 获取到 JSP 页面 [重复]

    这个问题在这里已经有答案了 我目前必须生成一个显示字符串文本的图像 我需要在 Servlet 上制作此图像 然后以某种方式将图像传递到 JSP 页面 以便它可以显示它 我试图避免保存图像 而是以某种方式将图像流式传输到 JSP 自从我开始寻
  • 像 Java 这样的静态类型语言中动态方法解析背后的原因是什么

    我对 Java 中引用变量的动态 静态类型和动态方法解析的概念有点困惑 考虑 public class Types Override public boolean equals Object obj System out println i
  • 如何对不同的参数类型使用相同的java方法?

    我的问题 我有 2 个已定义的记录 创建对象请求 更新对象请求 必须通过实用方法进行验证 由于这两个对象具有相同的字段 因此可以对这两种类型应用相同的验证方法 现在我只是使用两种方法进行重载 但它很冗长 public record Crea
  • java.io.Serialized 在 C/C++ 中的等价物是什么?

    C C 的等价物是什么java io Serialized https docs oracle com javase 7 docs api java io Serializable html 有对序列化库的引用 用 C 序列化数据结构 ht
  • 专门针对 JSP 的测试驱动开发

    在理解 TDD 到底是什么之前 我就已经开始编写测试驱动的代码了 在没有实现的情况下调用函数和类可以帮助我以更快 更有效的方式理解和构建我的应用程序 所以我非常习惯编写代码 gt 编译它 gt 看到它失败 gt 通过构建其实现来修复它的过程
  • 最新的 Hibernate 和 Derby:无法建立 JDBC 连接

    我正在尝试创建一个使用 Hibernate 连接到 Derby 数据库的准系统项目 我正在使用 Hibernate 和 Derby 的最新版本 但我得到的是通用的Unable to make JDBC Connection error 这是
  • Eclipse 启动时崩溃;退出代码=13

    I am trying to work with Eclipse Helios on my x64 machine Im pretty sure now that this problem could occur with any ecli
  • 我如何在java中读取二进制数据文件

    因此 我正在为学校做一个项目 我需要读取二进制数据文件并使用它来生成角色的统计数据 例如力量和智慧 它的设置是让前 8 位组成一个统计数据 我想知道执行此操作的实际语法是什么 是不是就像读文本文件一样 这样 File file new Fi
  • Opencv Java 灰度

    我编写了以下程序 尝试从彩色转换为灰度 Mat newImage Imgcodecs imread q1 jpg Mat image new Mat new Size newImage cols newImage rows CvType C
  • Android 中的处理程序与异步调用

    目前我正在使用处理程序来调用 Web 服务方法以使其在后台运行 问题是它需要更多的时间来给出响应 在性能方面似乎更昂贵 现在我计划使用异步调用 哪一个是最好的 Android 中的处理程序和异步调用有什么区别 请帮我想出一个最好的解决方案
  • 使用 CXF-RS 组件时,为什么我们使用 而不是普通的

    作为后续这个问题 https stackoverflow com questions 20598199 对于如何正确使用CXF RS组件我还是有点困惑 我很困惑为什么我们需要
  • 如果没有抽象成员,基类是否应该标记为抽象?

    如果一个类没有抽象成员 可以将其标记为抽象吗 即使没有实际理由直接实例化它 除了单元测试 是的 将不应该实例化的基类显式标记为抽象是合理且有益的 即使在没有抽象方法的情况下也是如此 它强制执行通用准则来使非叶类抽象 它阻止其他程序员创建该类
  • 如何防止在Spring Boot单元测试中执行import.sql

    我的类路径中有一个 import sql 文件 其中包含一些 INSERT 语句 当使用 profile devel 运行我的应用程序时 它的数据被加载到 postgres 数据库中 到目前为止一切正常 当使用测试配置文件执行测试时 imp
  • Spring Boot 无法更新 azure cosmos db(MongoDb) 上的分片集合

    我的数据库中存在一个集合 documentDev 其分片键为 dNumber 样本文件 id 12831221wadaee23 dNumber 115 processed false 如果我尝试使用以下命令通过任何查询工具更新此文档 db

随机推荐

  • 具有负载均衡器可扩展性的 websocket

    我的网站使用负载均衡器 浏览器启动与我的应用程序服务器的 Websocket 连接 打开的连接是否会消耗负载均衡器上的任何资源 还是直接在浏览器和应用程序服务器之间建立 如果 LB 上有某个打开的东西 那不是瓶颈吗 我的意思是 如果我的 L
  • UIScrollView 中 UITableView 的内容大小问题

    我实际上创建了一个UIScrollView with a UITableView里面有界面生成器 我设置了我的内容大小UIScrollView with scrollView contentSize CGSizeMake self view
  • 如何使用 C++ 在 Linux 终端中显示 unicode 字符?

    我正在 Linux 环境下用 C 开发国际象棋游戏 并且想在 bash 终端中使用 unicode 字符显示棋子 有没有办法使用cout显示符号 输出骑士的例子就很好 U 265E 要输出 Unicode 字符 只需使用输出流 就像输出 A
  • 等待函数直到用户停止输入

    我有用户在打字时进行 ajax 调用 问题是它会对输入的每个字母进行调用 所以我设置超时如下 input live keyup function e setTimeout function var xx input val doSearch
  • 如何在 SQL 中对一系列日期进行移动平均?

    假设我有两列 日期和值 日期不一定是有规律的间隔 如何创建过去 N 天内 VALUE 的移动平均值 我正在使用 postgres 但 mysql 解决方案也会有帮助 Data DATE VALUE 2012 11 05 10 2012 10
  • 如何在 SwiftUI 中获取视图或屏幕的高度和宽度

    我使用拖动手势来更改颜色对象的色相 饱和度 这个想法是 您可以在屏幕上拖动并查看所有色调值 0 0 1 0 以及从上到下相同的饱和度 我需要屏幕 或视图 这是一个单视图应用程序 的大小 以便将 CGPoint 值标准化 转换为 0 0 1
  • Laravel 共享主机 .htaccess

    我正在尝试将 Laravel 项目部署到共享托管上 我已经成功完成了大部分艰苦工作 但我无法在没有 Forbidden 问题的情况下剥离 public 目录 该网站可以正常工作并为这些链接显示相同的页面 www mywebsite com
  • document.querySelectorAll的返回类型是什么

    假设我有以下列表 ol li Cookies ol li Coffee li li Milk li li class test1 Chocolate li ol 我在 html 的末尾执行此选择 var nodes document que
  • 如何将 JSON 字符串转换为数组

    我想做的是 从 php 中的文本区域获取 JSON 作为输入 使用此输入并将其转换为 JSON 并将其传递给 php curl 来发送请求 我从 api 的 get 获取 php 这个 json 字符串我想传递给 json 但它没有转换为数
  • 从长远来看值得使用 Redux-Saga 吗? [关闭]

    Closed 这个问题是基于意见的 目前不接受答案 Locked 这个问题及其答案是locked因为这个问题是题外话 但却具有历史意义 目前不接受新的答案或互动 Redux Saga 是一个 Redux 副作用管理器 据说已被弃用 并且不再
  • 使用 angularfire2 和 firestore 创建自动完成搜索?

    我正在尝试为我的网络应用程序构建一个简单的搜索功能 有关于如何使用实时数据库创建它的文档 我需要做出哪些改变才能使这项工作正常进行火库 本教程取自这里https angularfirebase com lessons autocomplet
  • Python 读取输入时出现 EOF 错误

    n input dum input d for i in range 0 n 1 x raw input x x split d int x 0 int x 1 array d keys for key in d keys if d key
  • 没有完整命名空间的类型引用

    有两个打字稿文件 A ts export class Person public name string constructor and B ts import A module A var p A Person 到目前为止一切正常 但是
  • 处理一元运算符的中缀到后缀算法

    算法的 I p 将是这样的表达式 a b a b c 即标准 C 编译器支持的任何表达式 现在我已经将输入格式化为标记流 标记包含信息 无论是运算符还是操作数 该算法应该接受这个并给我一个可以计算的后缀表达式 如果我使用标准转换算法 我无法
  • 在 Laravel 中访问 $_GET 值的最佳实践是什么?

    有没有更好的访问方式 GET而不是 Laravel 中的变量本身 或者就是这样 我需要 API 的多个参数 例如 users q keyword order desc limit 5 是否有更干净 更安全且类似 Laravel 的方式来访问
  • 使用 Azure Functions 在本地存储状态

    Azure Functions 是否提供本地 状态 存储来消除调用其他服务 例如存储 docDB 等 的需要 功能基于 Azure 应用服务构建 提供存储持久文件的功能 例如您可以将文件存储在 HOME data SomeFolderOfY
  • 在 Equinox 中,是否可以将 OSGi 包标记为从其包含功能的 p2.inf 开始?

    我有一个 Eclipse 功能 其中包含多个捆绑包 我想告诉 p2 在安装该功能时将其中一个捆绑包标记为已启动 这可以使用捆绑包自己的 META INF p2 inf 来实现 如下所示 instructions configure mark
  • Json.NET:反序列化嵌套 Json

    如何反序列化此 Json 字符串上的 Items 类部分 Buddies count 1 items id 5099207ee4b0cfbb6a2bd4ec firstName Foo lastName Bar image url size
  • Buildozer 未能执行最后一个命令

    当我尝试在我的设备上构建 推送并自动运行 apk 时 使用buildozer android debug deploy run它显示这些错误 Check configuration tokens Ensure build layout Ch
  • notify可以多次唤醒同一个线程吗?

    想象一下 Java 中有一个典型的生产者 消费者模式 为了提高效率 你想使用notify 并不是notifyAll 当一个新元素被添加到队列中时 如果两个生产者线程调用notify 是否可以保证两个不同的等待消费者线程会被唤醒 或者可以是两