多线程:为啥无法避免并发修改异常?(假设有两个线程,线程A,线程B),怎么避免并发修改异常?
首先要明确你将哪个数据作为共享变量,
是ArrayList对象
迭代器对象iterator
其次有两种并发修改操作:
通过迭代器的remove修改源集合对象
通过源集合类的方法修改源集合对象
一.以ArrayList对象作为共享数据的情景:,
并发修改操作1:如果在线程体中通过ArrayList生成迭代器对象iterator,此时实际情况有两个迭代器对象iterator,和一个ArrayList共享对象,三个对象。在线程A迭代的过程中,用源集合对象调用方法修改,源集合对象中的modCount+1,在下次线程A迭代器迭代的时候,校验(expectedModCount== modCount),迭代器中的expectedModCount由于还是之前生成迭代器的时候保存的值,校验结果抛出异常,即使线程体上了锁,只要发生了源集合对象调用方法修改,就会出现并发修改异常。