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故障分析的主要内容,如果未能解决你的问题,请参考以下文章