我有以下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(),有时我在“ for”循环中得到java.util.ConcurrentModificationException。
但是我不明白为什么,因为我要锁定一个显然不起作用的对象,因为我可以在输出中连续看到两个“开始”。

先感谢您。

最佳答案

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

在您的情况下,您可以接受任意集合,获取私有锁,然后对该集合进行操作。同时,您的其余代码可以在其他线程中对集合执行任何操作,而不必争夺您的私有锁来执行此操作。

您必须对代码进行重大的重新设计,以使对相关集合的所有访问都被同一锁覆盖。

07-24 15:35