我正在开发一个系统,它有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]
答案 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);
}