求解疑难杂症,java多线程只读访问静态List,n次后开始报错

feigecsdn 2017-03-24 09:57:56
应用中碰到的问题,某个类有static List<String> list = new ArrayList<String>(),list中仅添加了一个字符串,对外提供一个接口,接口for(String s: list){ exec(s); },其中,exec方法中将变量s分发给多个线程,线程中处理该字符串。
问题来了,接口被调用几十次后(每次调用间隔一分钟),开始报错java.util.ArrayList$Itr.checkForComodification。
写测试代码模拟上述场景,未复现此问题。
想请教大家,这个问题可能是哪里引起的?
...全文
280 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
yql1986 2017-03-24
  • 打赏
  • 举报
回复
有没有执行对list执行remove
feigecsdn 2017-03-24
  • 打赏
  • 举报
回复
引用 3 楼 yql1986 的回复:
接口被调用几十次后(每次调用间隔一分钟) 有没有前后两次调用的执行这段代码的时间窗口有重叠的可能,如果有的话就是属于多线程访问ArrayList
没有,根据日志看,也是调用的时候才报错,时间间隔与调用时间间隔一致
yql1986 2017-03-24
  • 打赏
  • 举报
回复
接口被调用几十次后(每次调用间隔一分钟) 有没有前后两次调用的执行这段代码的时间窗口有重叠的可能,如果有的话就是属于多线程访问ArrayList
feigecsdn 2017-03-24
  • 打赏
  • 举报
回复
引用 1 楼 yql1986 的回复:
java多线程只读访问静态List 多线程访问共享变量,ArrayList不是线程安全的啊。 多个线程调用 ArrayList 的 游标 引起了并发异常,可以看一下ArrayList的源码就知道了 使用Collections.synchronizedList包装一下静态List
其实访问list的不是多线程,多线程访问的是list里的string对象,list是for循环的,有没有可能跟这种for(String s:list)的访问方式有关?
yql1986 2017-03-24
  • 打赏
  • 举报
回复
java多线程只读访问静态List 多线程访问共享变量,ArrayList不是线程安全的啊。 多个线程调用 ArrayList 的 游标 引起了并发异常,可以看一下ArrayList的源码就知道了 使用Collections.synchronizedList包装一下静态List
feigecsdn 2017-03-24
  • 打赏
  • 举报
回复
引用 5 楼 yql1986 的回复:
有没有执行对list执行remove
除了for循环外,没有其他任何操作。怪就怪在,可以正常访问,从某次调用开始,后面的所有调用都会出错
幽饮烛 2017-03-24
  • 打赏
  • 举报
回复
删除或添加 list 元素的时候其它线程如果在迭代这个list,就会出现这个“迭代快速失败异常”, 把list弄成同步的,或者手动加锁。

51,412

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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