Java ArrayList中的ConcurrentModification异常
我知道在这个问题上有很多问题,但在我的情况下,我有一个同步块,我相信没有人会改变我的阵列列表。。但如果我在每个循环中使用,有时仍然会出现这种异常。。为什么? 这是我的代码片段Java ArrayList中的ConcurrentModification异常,java,android,iterator,synchronized,Java,Android,Iterator,Synchronized,我知道在这个问题上有很多问题,但在我的情况下,我有一个同步块,我相信没有人会改变我的阵列列表。。但如果我在每个循环中使用,有时仍然会出现这种异常。。为什么? 这是我的代码片段 final static Object mLock = new Object(); private static ArrayList<ConnectionAndAuthCallback> mCallbacks; private void callAuthCallbacks() { syn
final static Object mLock = new Object();
private static ArrayList<ConnectionAndAuthCallback> mCallbacks;
private void callAuthCallbacks() {
synchronized (mLock) {
if (mCallbacks != null)
for (ConnectionAndAuthCallback calback : mCallbacks) { //here i get exception
calback.onAuthentication(mToken, calback.intent);
}
}
}
在注销功能中
public static void unRegisterAuthCallbacks(ConnectionAndAuthCallback callback) {
synchronized (mLock) {
if (mCallbacks != null)
if (mCallbacks.contains(callback)) {
mCallbacks.remove(callback); // This causing problem ?? In same thread "syncronised" wont work ??
}
}
}
在当前正在读取或循环的情况下,无法对ArrayList或remove()执行修改。改用迭代器
答案是,在同一个线程中,
synchronized(){}
无法工作。
即使你认为它是有效的,那也可能是死锁
在我的例子中,我在调用callback的同一个线程中从
ArrayList
删除了callback对象。看来您走错了方向。此代码块不应导致此异常。您在代码中的其他位置使用了mCallbacks
?您是否在调用callAuthCallbacks()
之前的某个时间点迭代mCallbacks
?您始终可以创建自己的ArrayList
子类,每当列表发生更改时记录该子类,并由谁更改,然后在中替换该子类。这总是一种有趣的调试技术。是的,mCallbacks在其他地方也会被迭代,但它们太位于sync
blockWell内部,这很奇怪。似乎不应该出现例外情况,如果我们都无法重现您的问题,那么帮助您将有点困难。。。试试ArrayList
子类的方法,看看是否有帮助?在我问这个问题之前,我已经讨论过了。显然,它解决了这个问题。
public static void unRegisterAuthCallbacks(ConnectionAndAuthCallback callback) {
synchronized (mLock) {
if (mCallbacks != null)
if (mCallbacks.contains(callback)) {
mCallbacks.remove(callback); // This causing problem ?? In same thread "syncronised" wont work ??
}
}
}