本文內容摘要:我有一組訂購商品,其訂購可能隨時間而改變。我需要能夠從多個線程遍歷這個集合,每個線程也可能需要更新這些項目的順序。對ConcurrentSkipListMap/ConcurrentSkipListSet中的鍵重新排序的原子方法?
例如,多個線程需要以某種任意排序順序訪問String
鍵。他們的字符串不是根據自然順序排序,而是根據可能會改變的某些值進行排序(因此,自定義Comparator
)。我最初的實現是使用TreeSet
並對其進行同步。如果任何密鑰需要重新排序,則線程將從地圖中刪除密鑰,更新比較值並重新插入密鑰。要實現這一點,密鑰是本機String
s,但比較器可以訪問這些值。這是一種奇怪的安排,其中鍵的順序可能會隨着時間而改變,但是由於改變的鍵總是被移除並在改變時重新插入,所以它似乎起作用。 (我想這也可以工作,如果String
小號包裹另一個對象中。)
我最近才知道原來ConcurrentSkipListSet
/ConcurrentSkipListMap
實現它們基本上是線程安全的有序集合的(相應的地圖。)好像我現在可以循環訪問密鑰而不必鎖定整個數據結構。但是,有沒有一種方法可以使用它們以原子方式刪除某個鍵並將其替換爲另一個鍵,如上面所做的操作,以便其他迭代線程不會錯過該項目,並且無需使用synchronize
塊?
如果任何人都可以爲這種類型的操作建議更好的數據結構,我也是耳朵!
這種設計會讓我真的很緊張。比較器不應隨時間而改變。 – 2013-03-19 18:22:59
對於需要維護一組對象的訂單可能會隨時間而改變的內容,您會提出什麼建議? – 2013-03-19 18:24:26
每次都可以使用新的比較器進行排序的列表,或者,我會編輯我的StackOverflow問題,向我們提供有關使您需要這種數據結構的問題的更多詳細信息。 ;) – 2013-03-19 18:29:12