繁体   English   中英

并发更新

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM