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