为什么notifyAll()不能在线程实例中使用?

用户名

我使用的源代码分析器指出,不应在Thread实例中调用notifyAll()。我正试图向管理层阐明这一点,但我无法提出解释。有人能帮我吗??

顺便说一句,这是继承的代码,所以我不负责设计决策!

内森·休斯(Nathan Hughes)

听起来您正在看到的SONAR消息就是这样的

切勿在线程实例squid:S2236上调用方法“ wait(...)”,“ notify()”和“ notifyAll()”

声纳对此有详细说明:

在Thread实例上,方法wait(...),notify()和notifyAll()仅在Java中所有类都扩展Object并因此自动继承方法后才可用。但是有两个很好的理由不对Thread实例调用这些方法:

这样做确实令人困惑。例如,在线程上调用wait(...)方法时,真正期望什么?是线程的执行被挂起,还是等待对象监视器的获取?

在内部,JVM依靠这些方法来更改线程的状态(BLOCKED,WAITING等),因此调用它们将破坏JVM的行为。

同样,Java API中给出建议是:

建议应用程序不要在线程实例上使用wait,notify或notifyAll。

内部线程管理通过锁定线程对象来完成。如果您自己的应用程序代码锁定在线程上,则可能会导致意外或混乱的行为。例如,当线程终止时,它将向每个等待该线程的线程发送通知。

在尝试评估问题的可能性时,我会寻找一种情况,即线程可能被用作应用程序代码的锁定和内部JVM代码的锁定,从而可能收到错误通知或错过通知。(这似乎很乏味。)根据代码,我还将寻找由于锁定线程而不是锁定线程访问的数据结构而可能导致的一致性问题,并评估锁定方案是否有意义。如果代码是线程的子类,我想检查线程是否被合并以及如何合并。

通常,此消息会让我想到,如果这段代码在做一件不好的事情,那么还有什么可能做错了?SONAR消息只是暗示它在代码中发现了难闻的气味,因此您可以进行调查并查看问题的严重性。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么我不能在界面中使用默认方法?

为什么我不能在匿名类中使用<Class> .this?

为什么我不能在开关案例中使用枚举?

为什么不能在DELETE语句中使用别名?

为什么不能在分配中使用Unicode字符√和??

为什么复数文字不能在clang中使用?

为什么不能在表达式中使用...语法?

为什么不能在此实例声明中使用类型变量?

为什么我不能在Spark的mapPartitions中使用foreach

为什么我不能在CSS Variable中使用rgba?

为什么不能在data.table中使用`predict`?

为什么不能在let或run中使用continue

为什么我不能在列表中使用匿名函数?

为什么不能在线程宏中使用匿名函数?

Prolog:为什么我不能在新线程中使用read(-Term)?

为什么不能在递归函数中使用yield

为什么我不能在Swift中使用'object == nil'?

为什么我们不能在扩展类的静态方法中使用此实例?

为什么限制不能在拆分方法中使用?

为什么不能在PowerShell中使用“查找”?

为什么我不能在TRecord中使用Variable?

为什么通配符不能在Elasticsearch中使用`@`?

为什么不能在实例初始化程序块中使用final字段?

为什么不能在QLineEdit对象中使用StyleSheet?

为什么不能在 if 语句中使用空指针?

为什么不能在 for 循环中使用类型提示?

为什么我不能在线程之间发送 Mutex<*mut c_void>?

为什么我不能在 Spark 中使用 combineByKey?

为什么我不能在这个特性中使用我的实例?