Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Can';t同步(java.util.ConcurrentModificationException)_Java_Concurrency_Synchronized - Fatal编程技术网

Can';t同步(java.util.ConcurrentModificationException)

Can';t同步(java.util.ConcurrentModificationException),java,concurrency,synchronized,Java,Concurrency,Synchronized,我有以下Java代码: private Object guiUpdateLock = new Object(); public void updateLinkBar(SortedSet<Arbitrage> arbitrages) { synchronized (guiUpdateLock) { System.out.println("start"); for (Arbitrage arbitrage : arbitrages) {

我有以下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");
    }
}
private Object guiUpdateLock=new Object();
公共无效更新Lnkbar(分类套套利){
已同步(guiUpdateLock){
系统输出打印项次(“开始”);
for(套利套利:套利){
//做一些GUI的东西
}
系统输出打印项次(“结束”);
}
}
UpdateLink()是从许多线程中调用的,有时我会在“for”循环中得到java.util.ConcurrentModificationException。 但我不明白为什么,因为我正在锁定对象,这显然不起作用,因为我可以在输出中看到一行中有两个“开始”


提前谢谢。

没有完整的代码,我不得不猜测,但最有可能的情况是两个线程使用不同的
guiUpdateLog
-对象进行同步。我进一步猜测,他们使用的是包含
guiUpdateLock
-的类的不同实例,并且由于它不是静态的,因此也会有不同的
对象
-实例。

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

在您的情况下,您接受任意集合,获取您的私有锁,并对集合进行操作。同时,在其他线程中,代码的其余部分可以对集合执行任何它想执行的操作,而不必与您的私有锁争用


您必须重新设计代码,以使对所讨论集合的所有访问都包含在同一个锁中。

//做一些GUI工作
可能对这个问题很重要。在该代码中的任何一点上,您是从
套利中删除一个元素还是向
套利中添加一个元素?您直接使用的是输入参数套利。尽管您正在同步方法中的代码片段,但没有任何东西可以阻止其他线程修改套利引用的同一实例,以防它们也获得对该实例的引用。