java concurrentModificationException 异常

今天早上同事发来一张图,显示一个刚刚系统异常了

java concurrentModificationException 异常_第1张图片

异常的发生一个获取缓存的类里, 初步分析是多线程执行缓存里的List时,ArrayList非线程安全导致

复现: 

     三个线程对同一个缓存List进行读,写,删除

java concurrentModificationException 异常_第2张图片
java concurrentModificationException 异常_第3张图片
java concurrentModificationException 异常_第4张图片

复现问题: 

java concurrentModificationException 异常_第5张图片

看代码发现: 

      每次操作时,list定义的两个值,一个预期修改值,一个修改值,当执行修改动作时,modCount值会++

java concurrentModificationException 异常_第6张图片

    如果预期值与修改值不一样就抛出异常

java concurrentModificationException 异常_第7张图片

所以多线程时,有可能一个线程修改了modCount,而另一个线程刚好检查时,则抛出异常

修改方案:

    1. 用线程安全的List.  CopyOnWriteArrayList , 因为我的是在缓存时的,所以不能用此方法,会导致强转报错

    2. 加锁  

  staticReentrantReadWriteLockreadWriteLock=newReentrantReadWriteLock();

 staticLockreadLock=readWriteLock.readLock();

 staticLockwriteLock=readWriteLock.writeLock();



java concurrentModificationException 异常_第8张图片
java concurrentModificationException 异常_第9张图片

你可能感兴趣的:(java concurrentModificationException 异常)