无法同步(java.util.ConcurrentModificationException)

时间:2014-04-11 11:35:16

标签: java concurrency synchronized

我有以下Java代码:

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()是从许多线程调用的,偶尔我会在&#34;中获得java.util.ConcurrentModificationException,因为&#34;周期。 但是我无法理解为什么因为我锁定对象显然不起作用,因为我可以看到两个&#34; start&#34;在输出中连续。

提前谢谢。

2 个答案:

答案 0 :(得分:1)

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

在您的情况下,您接受任意集合,获取您的私人锁,并对集合进行操作。与此同时,其他代码可能会在其他线程中对集合执行任何操作,并且不必争用您的私有锁来执行此操作。

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

答案 1 :(得分:0)

如果没有完整的代码,我不得不求助于猜测,但最可能的情况是两个线程使用不同的guiUpdateLog - 对象进行同步。我进一步猜测他们正在使用包含guiUpdateLock的类的不同实例 - 并且因为它不是静态的,所以也会有不同的Object - 实例。