2010-01-19 61 views
1

我有一個由各種線程隨機更新的列表的共享實例(對象只能通過線程添加到它)。然後我有一個計時器,它可以根據一組標準從列表中刪除記錄 - 具體來說,如果記錄早於x分鐘,則執行該計時器。我發現的是,當我的系統擴展並且線程變得更多時,清理列表的方法將在它迭代它時隨機拋出異常。我認爲這是由於列表更新和刪除記錄之間的爭用所致。迭代完成時,防止異常情況的最佳方法是鎖定共享實例嗎?如果是這樣,那麼這樣做的負面影響是什麼。如果不是,還有什麼其他選擇?在多線程上維護集合的模型

我確定這是一個非常基本的問題,但我是線程問題的新手。

回答

0

我不認爲這是足夠強烈的:你必須鎖定它。注意一個List不是一個很好的集合對象來執行此操作,刪除舊項目需要花費O(n^2)。考慮從舊的創建一個新的列表或使用LinkedList。

2

我會鎖定它。添加刪除方案的鎖的實際價格應該非常低。這聽起來像清理過程將是豬。這完全取決於它需要清理多少東西。

0

是的。異常很可能是由於同步問題。你一定需要鎖定它。但是,您也可能想要控制在系統擴展時訪問列表的線程數。否則線程可能會慢慢等待這個列表。