我有以下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。但是我不明白为什么,因为我正在对对象进行锁定,而这个锁显然不起作用,因为我可以在输出中看到两个“开始”。
提前谢谢你。
发布于 2014-04-11 11:45:52
锁必须保护对象,而不是代码段。
在这种情况下,可以接受任意集合,获取私有锁,并对集合进行操作。同时,在其他线程中,您的其余代码可能会对集合做它想做的任何事情,并且它不需要争您的私有锁来完成它。
您必须对代码进行重大重新设计,以便将所有对有关集合的访问都包含在同一个锁中。
发布于 2014-04-11 11:43:25
如果没有完整的代码,我不得不猜测,但最有可能的情况是,这两个线程使用不同的guiUpdateLog
-Objects进行同步。我进一步猜测,他们使用的是包含guiUpdateLock
的类的不同实例,而且由于它不是静态的,所以也会有不同的Object
-instances。
https://stackoverflow.com/questions/23011480
复制相似问题