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可以多次唤醒同一个线程吗? 的相关文章

随机推荐

  • 具有负载均衡器可扩展性的 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 是否可以保证两个不同的等待消费者线程会被唤醒 或者可以是两