线程“线程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
}
但它说“非最终字段的同步”。
答
非终结字段的同步is only a warning您可以放心忽略。 如果仅在构造函数中分配了arraylist
,则可以将其声明为final
并排除警告。
您需要在列表上进行同步,因为remove
方法本身不是线程安全的(而remove
正在搜索的元素要删除一个线程可以修改列表)。
答
好像有其他操作arraylist
没有同步。
Synchronization of non-final field
编译器提供此警告,当有多个线程正确同步一段代码时,它们需要在同一个对象实例上进行同步。
....所以让它最终?无论如何,我认为syn on on-file是一个警告,而不是一个错误 – radai 2013-03-18 13:39:09
see here http://stackoverflow.com/questions/6910807/synchronization-of-non-final-field – PSR 2013-03-18 13:40:15
'ConcurrentModificationException'通常意味着你正在修改集合**而你正在迭代它**。通常与线程无关。 – OldCurmudgeon 2013-03-18 13:43:07