0

我正在开发一个系统,它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

4 回答 4

2

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

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

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

在单个线程中,您将获得 ConcurrentModificationException。在这种情况下,您将不得不使用 ListIterator 和它的 remove 方法。

于 2012-08-13T11:35:53.793 回答
1

您是否考虑过CopyOnWriteArrayList

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

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

于 2012-08-13T11:06:44.827 回答
0

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

于 2012-08-13T11:10:58.417 回答
0

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

synchronize(myList)
{
  myList.add(object);
}
于 2012-08-13T11:15:13.360 回答