【问题标题】:ConcurrentModificationException: Need help understanding "synchronized"ConcurrentModificationException:需要帮助理解“同步”
【发布时间】:2014-11-25 16:35:43
【问题描述】:

以下方法会引发 ConcurrentModificationException,因为它迭代的列表已被修改。我可以在修改或迭代列表时使用同步来锁定...某物...吗?

我该怎么做呢?我尝试了几种方法,但它们似乎都不起作用。例如,锁定“this”不起作用。

public class Deck extends ArrayList<Card> {
...
    public void render(Canvas canvas) {
       for (Card card : this) {
           // Do stuff
       }
    }
...
}

【问题讨论】:

标签: android concurrency


【解决方案1】:

您需要使用迭代器及其方法来添加/删除项目,例如:

public class Deck extends ArrayList<Card> {
...
    public void render(Canvas canvas) {

       Iterator<Card> it = iterator();
       while (it.hasNext()) {
           Card card = it.next;
           // Do stuff
           // remove card
           it.remove();
           // add new card
           it.add(new Card());
       }
    }
...
}

【讨论】:

  • 同步还是同步?
  • 嗯,没听懂。如果在迭代器调用 hasNext() 之后删除了一个项目会发生什么?我不明白这如何解决并发问题。
  • 这没有提供问题的答案。要批评或要求作者澄清,请在其帖子下方发表评论。
  • @gipinani 为什么说它没有提供答案?他正在做一个 for 循环,修改列表并有一个 ConcurrentModificationException。通过使用迭代器和添加/删除方法,他可以在迭代时更改列表
  • 我试过了,但不幸的是迭代器在删除项目时有同样的并发问题。我最终在整个地方都发送了“同步”垃圾邮件,这似乎已经解决了这个问题,尽管我对关键字的理解仍然如此。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-23
  • 2022-01-15
相关资源
最近更新 更多