在以往的工作经验中,ArrayList和HashMap是最常见使用的集合。以前面试准备有看到过关于ArrayList和HashMap类型都不是线程安全的文章,但奈何实际编码中并没有碰到过多线程操作ArrayList和HashMap的场景,而导致的App崩溃。所以,即便是看过的也没有体会,并不会进脑子放心里。
这次在公司负责视频聊天的功能开发时,一开始也是习惯性地使用ArrayList和HashMap来临时缓存数据,起先业务还没有很复杂的时候,还没有发现过这个bug:java.util.ConcurrentModificationException
随着功能一直完善,账号的测试数据一直叠加,加上需要处理巨多的恶心离线数据时,我是真的被整疯了,各种崩,整个人都不好了。各种请教大神,找资料,各种尝试,最终才把这个恶心的bug也解决了。
下面,言归正传,总结一下我的bug修复历程:
1.bugly中建议: 使用ConcurrentHashMap替换HashMap,CopyOnWriteArrayList替换ArrayList
结论:CopyOnWriteArrayList这个能修复我的bug:java.util.ConcurrentModificationException 但是,也引起了新的bug,就是更新不及时,因为加锁的原因,导致多线程操作,一边被锁住,一边已经更新UI,导致拿到的数据不是最新的。
我对CopyOnWriteArrayList这个对象的理解并没有很透彻,但是多线程操作的时候还是建议慎用,坑埋得深深地。
2.Vector Vetor是ArrayList的升级版,是线程安全的。 听了大神建议,在网上找了相关资料,贴下
看到这些资料,我很慌啊,但我还是尝试了以下,发现并修复我的bug
**3.重点来了,最终我使用了Collections.synchronizedList,完美地解决了我的问题,而且也没有挖新的坑,当然其他的bug并不是它带来的。
结论:推荐!!!**
关于多线程操作HashMap而导致的App崩溃,同样也是报了这个bug:java.util.ConcurrentModificationException
4.最终方案:使用ConcurrentHashMap替代HashMap