一些findbugs告警解决

这篇具有很好参考价值的文章主要介绍了一些findbugs告警解决。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

WA_NOT_IN_LOOP/NAKED_NOTIFY/UNCOND_WAIT

这几个告警涉及到wait和notify的使用方法,网上文章语焉不详的,这里记录一下怎么处理。

WA_NOT_IN_LOOP:wait要在loop循环里。
NAKED_NOTIFY:notify/notifyAll调用之前要把资源准备好、把状态设置好,不能只调notify/notifyAll本身。
UNCOND_WAIT:跟WA_NOT_IN_LOOP其实是一个问题,wait要在loop循环里,且有一个条件变量控制

主要根因是,线程有可能被虚假的唤醒(spurious notify),这时需要一个条件变量确保其再次陷入等待。

摘了SO上的一段描述:

The problem is that you're trying to use wait and notify in ways that they are not designed to be used. Usually, wait and notify are used to have one thread wait until some condition is true, and then to have another thread signal that the condition may have become true. For example, they're often used as follows:

/* Producer */
synchronized (obj) {
    /* Make resource available. 这里要有条件变量设置的代码 */
    obj.notify();
}

/* Consumer */
synchronized (obj) {
    while (/* resource not available 这里要有条件变量就绪的判断,规避虚假唤醒问题 */) {
        obj.wait();
    }    

    /* Consume the resource. */
}
The reason that the above code works is that it doesn't matter which thread runs first. If the producer thread creates a resource and no one is waiting on obj, then when the consumer runs it will enter the while loop, notice that the resource has been produced, and then skip the call to wait. It can then consume the resource. If, on the other hand, the consumer runs first, it will notice in the while loop that the resource is not yet available and will wait for some other object to notify it. The other thread can then run, produce the resource, and notify the consumer thread that the resource is available. Once the original thread is awoken, it will notice that the condition of the loop is no longer true and will consume the resource.

More generally, Java suggests that you always call wait in a loop because of spurious notifications in which a thread can wake up from a call to wait without ever being notified of anything. Using the above pattern can prevent this.

总结起来,要将条件变量的设置+notify一起用synchronized包起来,将条件变量的while判断+wait一起用synchronized包起来,才能做到正确的使用wait/notify。
下面是一段常见的伪码样例:文章来源地址https://www.toymoban.com/news/detail-549567.html

@PreDestroy
public void fini() {
    synchronized (this) {
        this.isStopped = true;
        this.notifyAll();
    }
}

public void trigger(Event event) {
    synchronized (this) {
        this.isInProgress = event.hasSomeFlag();

        if (!this.isInProgress) {
            this.notifyAll();
        }
    }
}

public void wait4Sth() {
    synchronized (this) {
        while (this.isInProgress && !isStopped) {
            try {
                this.wait();
            } catch (InterruptedException e) {
                log.warn("wait4Sth interrupted, cause:{}", e.toString());
            }
        }
    }
}

到了这里,关于一些findbugs告警解决的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【华为OD统一考试B卷 | 100分】告警抑制(C++ Java Python)

    在线OJ 已购买本专栏用户,请私信博主开通账号,在线刷题!!! 运行出现 Runtime Error 0Aborted,请忽略 华为OD统一考试A卷+B卷 新题库说明 2023年5月份,华为官方已经将的 2022/0223Q(1/2/3/4)统一修改为OD统一考试(A卷)和OD统一考试(B卷)。 你收到的链接上面会标注A卷还是B卷。

    2024年02月16日
    浏览(49)
  • 基于elasticsearch的自定义业务告警的设计思路,java多线程面试题汇总

    这个是elasticsearch的官方插件,它可以根据数据的变化提供警报和通知,目前是收费的,具体操作配置可以参看官方地址 elastalert 是Yelp公司基于python写的告警框架,大家可以去GitHub上查看具体使用方法。elastalert 自定义开发 自定义开发实现 主要由以下几个步骤实现: 分离出单

    2024年04月25日
    浏览(40)
  • Nginx解决通过openssl自签名证书访问Https报不安全告警的问题

    nginx代理设置自签ssl证书并进行https方式访问,浏览器中会报不安全的告警,记录一下处理过程 本文内容摘自CSDN博主「Dylanu」的原创文章 解决https网站通过nginx+openssl自签名证书访问,在谷歌浏览器报不安全告警的问题 使用指定-subj “/C=CN/ST=MyProvince/L=MyCity/O=MyOrganization”,生成根

    2024年02月03日
    浏览(40)
  • Java项目中利用飞书自定义机器人Webhook向飞书群推送告警通知

    今天来看一下如何在Java项目中利用飞书的自定义机器人Webhook向飞书群推送告警通知         企业存在给 特定群组 自动推送消息的需求,比如:监控报警推送、销售线索推送、运营内容推送等。        你可以在群聊中添加一个 自定义机器人 ,通过服务端调用  webh

    2023年04月14日
    浏览(86)
  • Java ---一些关键字

     ①含义: this:当前对象 在构造器和非静态代码块中,表示正在new的对象 在实例方法中,表示调用当前方法的对象 ②this用法: this.成员变量:表示当前对象的某个成员变量,而不是局部变量 this.成员方法:表示当前对象的某个成员方法,完全可以省略this. this()或this(实参列

    2023年04月09日
    浏览(41)
  • 一些基础的java编程代码

    2024年02月08日
    浏览(39)
  • Java的一些常用注解及其作用

    1.1 @Component 通用的注解,可标注任意类为 Spring 组件。如果一个 Bean 不知道属于哪个层,可以使用@Component 注解标注。 1.2 @Repository 对应持久层即 Dao 层,主要用于数据库相关操作。 1.3 @Service 对应服务层,主要涉及一些复杂的逻辑,需要用到 Dao 层。 1.4 @Controller 对应 Spring MV

    2024年02月01日
    浏览(41)
  • 关于Java注解的一些理解 小结

    目录 1. 常用注解和理解 2. 自定义注解 2.1 案例背景 2.2 设计思路 3 总结 注解在我的理解下,就是代码中的特殊标记,这些标记可以在 编译、类加载、运行时 被读取,并执行相对应的处理。 可能有些抽象,简单来说注解其实在开发中是非常常见的,比如我们在使用各种框架时

    2023年04月23日
    浏览(42)
  • 【Java SE】循环一些基本练习

       

    2024年02月05日
    浏览(35)
  • 电脑的常见故障和一些解决方法。

    1.屏幕不显示 常见原因①:显示器未通电 解决方法:如果电源指示灯没亮,首先检查电源线是否有破损 的情况,在确定好电源线没有破损的情况下,检查电源线和显 示器是否正确连接,确保整个供电线路正常。 常见原因②:显示器通电但无画面 解决方法: (1)电源指示灯亮了但是

    2024年02月09日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包