【问题标题】:Exception in thread "Thread-1" java.util.ConcurrentModificationException线程“Thread-1”中的异常 java.util.ConcurrentModificationException
【发布时间】:2013-03-18 13:38:03
【问题描述】:

我的程序中有两个线程和一个 ArrayList。我想从我的线程访问列表。

public void run() {
...
arraylist.add(myObj);
...
}

public void run() {
...
arraylist.remove(myObj);
...
}

我试过同步每个线程。

 synchronized (arraylist) 
 {  
    //add or remove
 } 

但它说“非最终字段的同步”。

【问题讨论】:

  • ....所以最终确定?无论如何,我认为 ono-file 上的 syn 是一个警告,而不是一个错误
  • ConcurrentModificationException 通常意味着您正在修改集合在迭代它时。通常与线程无关。

标签: java multithreading arraylist synchronization


【解决方案1】:

非最终字段的同步 is only a warning 您可以放心忽略。 如果arraylist只在构造函数中赋值,可以声明为final,去掉警告。

您需要在列表上同步,因为remove 方法本质上不是线程安全的(一个线程可能会修改列表 remove 正在搜索要删除的元素) .

【讨论】:

    【解决方案2】:

    似乎arraylist 上还有其他操作没有同步。

    Synchronization of non-final field 当有多个线程正确同步代码块时,编译器会发出此警告,它们需要在同一个对象实例上同步。

    【讨论】:

      猜你喜欢
      • 2013-05-06
      • 1970-01-01
      • 1970-01-01
      • 2014-12-12
      • 2021-01-28
      • 1970-01-01
      • 1970-01-01
      • 2018-04-08
      • 1970-01-01
      相关资源
      最近更新 更多