java.util.ConcurrentModificationException故障分析

Posted xiangtingsulinlin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java.util.ConcurrentModificationException故障分析相关的知识,希望对你有一定的参考价值。

  • 问题描述
    账号打通上线后发现偶尔会出现java.lang.RuntimeException: java.util.ConcurrentModificationException异常,这个是在生成请求签名的时候发生的问题,经分析应该是阿里云网关比较老版本的方法有bug。这个会导致线上用户突然掉线,体验太差。
  • 出现该Exception的根本原因
    在对Vector、ArrayList在迭代的时候如果同时对其进行修改就会抛出java.util.ConcurrentModificationException异常。
  • 解决过程
    将老的换成新的阿里云网关SDK,在修改过程中发现jar包中一个方法参数传入错误,因此暂时不采用这种方式。采用方法重试因为这并不是因为逻辑错误导致,而是框架不稳定造成的,类似的像阿里云memcache不稳定的情况也可以采用复试的方法,这样可以有效的提高用户体验。
  • 修改的关键代码

  •  

    int retry_max = 3;
    for (int i = 0; i < retry_max; i++) {
        try {
            response = Client.execute(request);
            break;
        } catch (ConcurrentModificationException exception) {
            continue;
        } catch (Exception e) {
            break;
        }
    }

    这里需要注意:idea会提示continue是不必要的,因为在循环内抛出异常会直接跳出本次循环进入下一次循环,因此并不需要写continue也可以进入下次循环,但是这写可以提高可读性,暂时保留。

     

  • 测试思路

    由于这是一个并发问题,而服务的访问量级也在10000,因此发一万次请求模仿线上环境

  • 测试代码

    for (int i = 0; i< 10000;i++){
        CloseableHttpClient httpclient = HttpClients.createDefault();
        HttpGet httpget = new HttpGet("https://r2test.mjb6.cn:8443/api/user/detail?token=1422290-EqEE4pxRvk51K9KCkZpknRC4rj7y6GMa");
        CloseableHttpResponse response = httpclient.execute(httpget);
        LOGGER.error("response="+JSON.toJSONString(response));
    }

     

 





以上是关于java.util.ConcurrentModificationException故障分析的主要内容,如果未能解决你的问题,请参考以下文章