首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >无法同步(java.util.ConcurrentModificationException)

无法同步(java.util.ConcurrentModificationException)
EN

Stack Overflow用户
提问于 2014-04-11 11:35:16
回答 2查看 55关注 0票数 0

我有以下Java代码:

代码语言:javascript
运行
复制
private Object guiUpdateLock = new Object();

public void updateLinkBar(SortedSet<Arbitrage> arbitrages) {
    synchronized (guiUpdateLock) {
        System.out.println("start");
        for (Arbitrage arbitrage : arbitrages) {
          //do some GUI stuff
        }
        System.out.println("end");
    }
}

updateLinkBar()是从许多线程调用的,有时我会在"for“循环中获得java.util.ConcurrentModificationException。但是我不明白为什么,因为我正在对对象进行锁定,而这个锁显然不起作用,因为我可以在输出中看到两个“开始”。

提前谢谢你。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-04-11 11:45:52

锁必须保护对象,而不是代码段。

在这种情况下,可以接受任意集合,获取私有锁,并对集合进行操作。同时,在其他线程中,您的其余代码可能会对集合做它想做的任何事情,并且它不需要争您的私有锁来完成它。

您必须对代码进行重大重新设计,以便将所有对有关集合的访问都包含在同一个锁中。

票数 1
EN

Stack Overflow用户

发布于 2014-04-11 11:43:25

如果没有完整的代码,我不得不猜测,但最有可能的情况是,这两个线程使用不同的guiUpdateLog-Objects进行同步。我进一步猜测,他们使用的是包含guiUpdateLock的类的不同实例,而且由于它不是静态的,所以也会有不同的Object-instances。

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

https://stackoverflow.com/questions/23011480

复制
相关文章

相似问题

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