[英]Concurrent updates on Collection
我正在开发一个System,它具有ArrayList
,可以在几个地方访问(插入,删除和更新值)。 由于在我运行程序时在多个位置访问ArrayList
,因此出现并发更新错误。
我可以使用Vector
代替ArrayList
因为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]
还有一件事:您的ConcurrentModificationException可能不是通过两个线程从实际的并发修改中产生的。 还有另一个可能的原因:
在遍历ArrayList时,您可以删除一个元素。 如果你尝试这个
Object o = iterator.next()
if(someCondition)
arrayList.remove(o)
在单个线程中,您将获得ConcurrentModificationException。 在这种情况下,您将必须使用ListIterator,并且它是remove方法。
您是否考虑过CopyOnWriteArrayList ?
ArrayList的线程安全变体,其中所有可变操作(添加,设置等)都通过对基础数组进行全新复制来实现。
与以往一样,除非您知道这是一个问题,否则我不会太担心效率。
请参见Collections#synchronizedCollection(Collection) 。 这将返回一个同步的ArrayList
,可用于安全地添加/删除/更新列表中的元素。
您还可以在每次访问时同步ArrayList:
synchronize(myList)
{
myList.add(object);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.