【发布时间】:2014-04-11 11:35:16
【问题描述】:
我有以下 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。 但是我不明白为什么,因为我要锁定对象,这显然不起作用,因为我可以在输出中连续看到两个“开始”。
提前谢谢你。
【问题讨论】:
-
//do some GUI stuff可能对这个问题很重要。在该代码中的任何时候,您是从arbitrages中删除元素还是向arbitrages添加元素? -
您直接使用输入参数套利。尽管您正在同步方法中的代码 sn-p,但没有什么可以阻止其他线程修改套利引用的同一实例,以防它们也获得对它的引用。
标签: java concurrency synchronized