我有以下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;在输出中连续。
提前谢谢。
答案 0 :(得分:1)
锁必须保护对象而不是代码段。
在您的情况下,您接受任意集合,获取您的私人锁,并对集合进行操作。与此同时,其他代码可能会在其他线程中对集合执行任何操作,并且不必争用您的私有锁来执行此操作。
您必须对代码进行重大设计,以便对相关集合的所有访问都包含在同一个锁中。
答案 1 :(得分:0)
如果没有完整的代码,我不得不求助于猜测,但最可能的情况是两个线程使用不同的guiUpdateLog
- 对象进行同步。我进一步猜测他们正在使用包含guiUpdateLock
的类的不同实例 - 并且因为它不是静态的,所以也会有不同的Object
- 实例。