簡體   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