关于Collection的并发更新

时间:2012-08-13 11:04:10

标签: java collections arraylist

我正在开发一个系统,它有ArrayList可以在多个地方访问(插入,删除和更新值)。由于在运行程序时在几个地方访问ArrayList,因此会出现并发更新错误。

而不是ArrayList我可以使用Vector,因为Vector已同步。但是如果我使用Vector会导致降低系统性能吗?给我点子。我怎么能解决这个问题?

这是我得到的例外的一部分:

].[localhost].[/uckt].[Faces Servlet]] (http-127.0.0.1-8080-144) 
Servlet.service() for servlet Faces Servlet threw exception: java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(Unknown Source) [:1.7.0_02]
at java.util.ArrayList$Itr.next(Unknown Source) [:1.7.0_02] 

4 个答案:

答案 0 :(得分:2)

还有一件事:您的ConcurrentModificationException可能不会通过两个线程从实际的并发修改中生成。还有另一个可能的原因:

在迭代ArrayList时,您可能会删除一个元素。如果你试试这个

Object o = iterator.next()
if(someCondition)
    arrayList.remove(o)

在单个Thread中,您将获得ConcurrentModificationException。在这种情况下,您将不得不使用ListIterator,它是删除方法。

答案 1 :(得分:1)

您是否考虑过CopyOnWriteArrayList

  

ArrayList的线程安全变体,其中包含所有可变操作   (添加,设置等)是通过制作新的副本来实现的   底层数组。

与以往一样,在知道这是一个问题之前,我不会过分担心效率。

答案 2 :(得分:0)

Collections#synchronizedCollection(Collection)。这将返回一个同步的ArrayList,您可以使用它来安全地添加/删除/更新列表中的元素。

答案 3 :(得分:0)

您还可以在每次访问时同步您的ArrayList:

synchronize(myList)
{
  myList.add(object);
}