首页 > 其他分享 >缺陷 & 规避

缺陷 & 规避

时间:2024-06-13 14:32:39浏览次数:17  
标签:Checked 规避 线程 内存 volatile 缺陷 异常 public

1. NPE 空指针异常(Null Pointer Exception)

1)使用注解 @NotNull 和 @Nullable

2)用 Optional 处理链式调用

3)用 Objects.equals(a,b) 代替 a.equals(b),能够避免任意对象为 null 时的 NPE。

4)使用空对象模式,空对像模式通过一个特殊对象代替不存在的情况,代表对象不存在时的默认行为模式。例如:用 Empty List 代替 null,EmptyList 能够正常遍历:Collections.emptyList();

2. 线程安全

JVM 的内存模型十分复杂,难以理解, <<Java 并发编程实战>>告诉我们,除非你对 JVM 的线程安全原理十分熟悉,否则应该严格遵守基本的 Java 线程安全规则,使用 Java 内置的线程安全的类及关键字。

熟练使用线程安全类  ConcurrentHashMap

public class ConcurrentHashMapExample {
    private Map<String, String> map = new ConcurrentHashMap<>();

    public void append(String key, String suffix) {
        // 使用 computeIfPresent 原子操作
        map.computeIfPresent(key, (k, v) -> v + suffix);
    }
}

保证变更的原子性

使用不可变对象

正确性优先于性能:不要因为担心性能问题而放弃使用 synchronized,volatile 等关键字,或者采用一些非常规写法。

多线程环境中的volatile:在多线程编程中,每个线程可以拥有变量的独立拷贝,这可能导致数据不一致的问题。声明一个变量为volatile可以保证所有线程看到的都是主存中的最新版本,从而在一定程度上解决了线程间可见性的问题。尽管volatile不保证复合操作的原子性,它通过内存屏障来防止指令重排序,确保了操作的顺序性。

Java中的volatile:在Java中,volatile不仅保证了单个变量的可见性,还可以用于实现轻量级的同步,特别是在使用双重检查锁定模式(Double-Checked Locking)设计单例模式时。volatile关键字通过内存屏障来防止指令重排,这对于维持对象引用的可见性和一致性至关重要。

线程池使用不当


public class ThreadPoolExample {

    // 没有任何限制的线程池, 使用起来很方便, 但当一波请求高峰到达时, 可能会创建大量线程, 导致系统崩溃
    private static Executor executor = Executors.newCachedThreadPool();

}

手动创建线程池


public class ManualCreateThreadPool {

    // 手动创建资源有限的线程池
    private Executor executor = new ThreadPoolExecutor(10, 10, 1, TimeUnit.MINUTES, new ArrayBlockingQueue<>(1000),
        new ThreadFactoryBuilder().setNameFormat("work-%d").build());
}

通过 AOP 统一异常处理

  1. 避免未知异常抛给调用方, 将未知异常转为 Result 或者通用异常类型

  2. 统一异常日志的打印和监控

处理 Checked Exception

Checked Exception 是在编译期要求必须处理的异常,也就是非 RuntimeException 类型的异常,但 Java Checked 的异常给接口的调用者造成了一定的负担,导致异常声明层层传递,如果顶层能够处理该异常,我们可以通过 lombok 的 @SneakyThrows 注解规避 Checked exception。

Try catch 线程逻辑

特殊异常的处理

InterruptedException 一般是上层调度者主动发起的中断信号,例如某个任务执行超时,那么调度者通过将线程置为 interuppted 来中断任务,对于这类异常我们不应该在 catch 之后忽略,应该向上抛出或者将当前线程置为 interuppted。

避免 catch Error

不要吞并 Error,Error 设计本身就是区别于异常,一般不应该被 catch,更不能被吞掉。举个例子,OOM 有可能发生在任意代码位置,如果吞并 Error,让程序继续运行,那么以下代码的 start 和 end 就无法保证一致性。

内存/资源泄漏

虽然 JVM 有垃圾回收机制,但并不意味着内存泄漏问题不存在,一般内存泄漏发生在在长时间持对象无法释放的场景,比如静态集合,内存中的缓存数据,运行时类生成技术等。

Spring 事务问题,注意事务注解失效的场景

当打上 @Transactional 注解的 spring bean 被注入时,spring 会用事务代理过的对象代替原对象注入。

但是如果注解方法被同一个对象中的另一个方法里面调用,则该调用无法被 Spring 干预,自然事务注解也就失效了。

 @Component
 public class TransactionNotWork {
 ​
     public void doTheThing() {
         actuallyDoTheThing();
     }
 ​
     @Transactional
     public void actuallyDoTheThing() {
     }
 }

标签:Checked,规避,线程,内存,volatile,缺陷,异常,public
From: https://blog.csdn.net/m0_62986746/article/details/139653180

相关文章

  • dubbo~全局异常拦截器的使用与设计缺陷~续
    上一次的介绍,主要围绕如何统一去捕获异常,以及为每一种异常添加自己的Mapper实现,并且我们知道,当在ExceptionMapper中返回非200的Response,不支持application/json的响应类型,而是写死的text/plain类型。Filter为二方包异常手动捕获参考:https://blog.csdn.net/2401_84048290/article......
  • 从缺陷到创新:质量保障的新视角
    1.背景:最近一段时间研发大佬们在积极的治理告警,经过一段时间的治理,现在告警情况已经有了很大的改观,但难免还有漏网之鱼;具体我们可以以下边一个例子来看:这是一个生产的UMP告警,通过这个告警我们发现XXX这个应用的堆内存使用率为90.18%,超过了设置的告警阈值85%,所以产生了这样的......
  • dubbo~全局异常拦截器的使用与设计缺陷
    异常拦截器ExceptionMapper在JAX-RS(JavaAPIforRESTfulWebServices)中,ExceptionMapper接口用于将Java异常映射到HTTP响应。通过实现ExceptionMapper接口,你可以自定义如何处理特定类型的异常,并生成相应的HTTP响应。优先级和选择当有多个ExceptionMapper可用于处理同一类型的......
  • 软件缺陷数据度量和分析
    缺陷报告,是软件测试这个职位最重要得产出之一。甚至对软件测试这个行业你可以用比较狭隘的描述去定义他为:‘测试就是为了找到缺陷’。测试人员报出的缺陷,可以很好的反应产品中的问题,修复了这些问题,就可以有效的降低产品风险。其实缺陷报告不单单能帮助研发团队发现问题,他也......
  • [目标检测数据集]变电站缺陷检测数据集8307张17类别VOC和YOLO格式
    数据集格式:PascalVOC格式+YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件)图片数量(jpg文件个数):8307标注数量(xml文件个数):8307标注数量(txt文件个数):8307标注类别数:17标注类别名称:[“bj_bpmh”,“bj_bpps”,“bj_wkps”,......
  • 锐捷校园网自助服务-字符过滤存在缺陷
    锐捷校园网自助服务-字符过滤存在缺陷漏洞介绍令人感到十分遗憾的是,锐捷网络安全应急响应中心对漏洞上报似乎缺少了一些奖励,令人对官方上报漏洞失去了些许兴趣​。该缺陷仅仅打破了安全检查防护,并没有造成实质性危害,至于打破了护盾后能够产生什么样的具有实质性危害的web......
  • 聊聊缺陷逃逸率
    辅导星球一位同学模拟面试,过程中聊到了缺陷逃逸率相关的话题。我在以前写的关于质量保障相关的文章中提到过缺陷逃逸率,这是一项比较重要的衡量软件产品交付质量的指标。所谓缺陷逃逸率,指的是软件产品线上发布后,发生在线上环境的缺陷数量与该版本迭代生命周期内总缺陷数量的比率,......
  • adc 智能缺陷系统分析
     自动缺陷分类系统:    是以深度学习算法为核心技术,对输入的缺陷图片进行缺陷提取和分类的大型信息软件系统。    要用于替代人工,对工厂生产线AOI设备的缺陷检测结果进行二次复判,以达到节省人力,提高良率的目标。其特点如下:    可随制程设备单独部署,亦......
  • Java中的读写锁ReentrantReadWriteLock详解,存在一个小缺陷
    写在开头最近是和java.util.concurrent.locks包下的同步类干上了,素有并发根基之称的concurrent包中全是精品,今天我们继续哈,今天学习的主题要由一个大厂常问的Java面试题开始:小伙子,来说一说Java中的读写锁,你都用过哪些读写锁吧?这个问题小伙伴们遇到了该如何回答呢?心里琢磨去......
  • 最高法--质量保证金应按照《工程质量保修书》的约定从质量保修期满后开始计算利息系混
    (2020)最高法民申3252号  河南国安建设集团有限公司、河南亚星置业集团有限公司建设工程施工合同纠纷再审审查与审判监督民事裁定书本院认为:(三)关于二审判决认定的工程款利息起算点是否正确的问题。双方在《补充协议》第26.1.1.3条中约定,“剩余的5%作为质量保证金,待竣工验收合......