线程“线程1”中的异常java.util.ConcurrentModificationException

问题描述:

我的程序中有两个线程和一个ArrayList。我想从我的主题访问列表。线程“线程1”中的异常java.util.ConcurrentModificationException

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

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

我试着同步每个线程。

synchronized (arraylist) 
{ 
    //add or remove 
} 

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

+3

....所以让它最终?无论如何,我认为syn on on-file是一个警告,而不是一个错误 – radai 2013-03-18 13:39:09

+0

see here http://*.com/questions/6910807/synchronization-of-non-final-field – PSR 2013-03-18 13:40:15

+0

'ConcurrentModificationException'通常意味着你正在修改集合**而你正在迭代它**。通常与线程无关。 – OldCurmudgeon 2013-03-18 13:43:07

非终结字段的同步is only a warning您可以放心忽略。 如果仅在构造函数中分配了arraylist,则可以将其声明为final并排除警告。

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

好像有其他操作arraylist没有同步。

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