遇到一个java.util.ConcurrentModificationException错误,分析了代码没有想明白

depositpei 2018-02-03 03:49:47
错误堆栈如下

java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(Unknown Source)
at java.util.ArrayList$Itr.next(Unknown Source)
at com.simulation.httpclient.HttpsClient.sendPackageByHttpClient(HttpsClient.java:169)
at com.simulation.httpclient.HttpsClient.run(HttpsClient.java:79)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)

问题代码片段

while (true)
{
ArrayList<byte[]> messages = messageSendToSouth.take();
Iterator<byte[]> messageIterator = messages.iterator();
while (messageIterator.hasNext())
{
FullHttpRequest request = new DefaultFullHttpRequest(HTTP_1_1, POST, URL);
byte[] message = messageIterator.next(); //堆栈中打印的就是这个地方出现的ConcurrentModificationException
request.content().retain().writeBytes(message);
channel.flush();
}
}


我分析了代码没有想明白为啥出现这个错误,
1、messages 只是一个本地变量,此代码片段的确存在多线程访问,但是本地变量是线程私有的,疑问1
2、在第二个循环里面没有对messages list进行删除操作,怎么会导致list的modCount和expectedModCount不相等呢
...全文
1355 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
Spring89 2018-02-05
  • 打赏
  • 举报
回复
在循环里面对list,set,map等做结构性修改,本身就容易造成问题。所以,我觉得出这个异常是很正常的
Inhibitory 2018-02-04
  • 打赏
  • 举报
回复
多线程访问的共享变量的修改和读取放到同步代码块里
xiaovhao 2018-02-03
  • 打赏
  • 举报
回复
给你发个我之前回答过的帖子http://bbs.csdn.net/topics/392182590
oyljerry 2018-02-03
  • 打赏
  • 举报
回复 1
messages是不是多个线程取到同一个。

81,091

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧