Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/183.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ArrayList中的ConcurrentModification异常_Java_Android_Iterator_Synchronized - Fatal编程技术网

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 ??
                }
        }
    }