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

异常的发生一个获取缓存的类里, 初步分析是多线程执行缓存里的List时,ArrayList非线程安全导致
复现:
三个线程对同一个缓存List进行读,写,删除



复现问题:

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

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

所以多线程时,有可能一个线程修改了modCount,而另一个线程刚好检查时,则抛出异常
修改方案:
1. 用线程安全的List. CopyOnWriteArrayList , 因为我的是在缓存时的,所以不能用此方法,会导致强转报错
2. 加锁
staticReentrantReadWriteLockreadWriteLock=newReentrantReadWriteLock();
staticLockreadLock=readWriteLock.readLock();
staticLockwriteLock=readWriteLock.writeLock();


网友评论