【问题标题】:Can't synchronize (java.util.ConcurrentModificationException)无法同步 (java.util.ConcurrentModificationException)
【发布时间】: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


【解决方案1】:

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

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

您必须重新设计您的代码,以便对相关集合的所有访问都被同一个锁覆盖。

【讨论】:

    【解决方案2】:

    如果没有您的完整代码,我只能猜测,但最可能的情况是两个线程使用不同的guiUpdateLog-Objects 进行同步。我进一步的猜测是,他们正在使用包含 guiUpdateLock 的类的不同实例 - 因为它不是静态的,所以也会有不同的 Object-instances。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-18
      • 1970-01-01
      • 2023-03-09
      • 1970-01-01
      • 1970-01-01
      • 2020-05-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多