首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ConcurrentModification异常在ArrayList中

ConcurrentModification异常在ArrayList中
EN

Stack Overflow用户
提问于 2014-06-16 05:27:05
回答 2查看 146关注 0票数 2

我知道这里有很多问题,但在我的例子中,我把它放在一个同步块中,我相信没有人会改变我的数组列表。但是,如果我使用的是-每个循环,那么有时我还是会得到这个异常。为什么?

这是我的代码片段

代码语言:javascript
复制
    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);
                }
        }
    }

下面是我在回调时所做的代码

代码语言:javascript
复制
@Override
            public void onAuthentication(String token, Intent intent) {
                web.loadUrl("xyz.com");
                //unregister so that we wong get any exception or some more callbacks
                SameClass.unRegisterAuthCallbacks(this); 
            }

并且在注销函数中

代码语言:javascript
复制
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 ??
                }
        }
    }
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-06-22 15:22:43

答案是,在同一个线程中,synchronised(){}是行不通的。即使你认为它有效,也可能会有一把死锁。

在我的例子中,我在调用回调的同一个线程中从ArrayList中删除回调对象。

票数 0
EN

Stack Overflow用户

发布于 2014-06-16 05:54:09

您不能对ArrayList或remove()执行修改,在这种情况下,您目前正在读取或循环执行。使用迭代器代替。

Check out this link. And this link.

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24237082

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档