我有以下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。
但是我不明白为什么,因为我要锁定一个显然不起作用的对象,因为我可以在输出中连续看到两个“开始”。
先感谢您。
最佳答案
锁必须保护对象而不是代码段。
在您的情况下,您可以接受任意集合,获取私有锁,然后对该集合进行操作。同时,您的其余代码可以在其他线程中对集合执行任何操作,而不必争夺您的私有锁来执行此操作。
您必须对代码进行重大的重新设计,以使对相关集合的所有访问都被同一锁覆盖。