我有一個演員 - 在其本質上 - 維護一個對象列表。它有三個基本操作:添加,更新和刪除(有時從add方法中調用remove,但不在此處),並使用單個集合。顯然,該支持列表是併發訪問的,添加和刪除呼叫不斷交錯。如何處理對Scala集合的併發訪問?
我的第一個版本使用了ListBuffer,但是我在某處讀到它並不是爲了併發訪問。我沒有得到併發訪問異常,但我確實注意到,從中刪除對象並不總是可行,可能是由於併發性。
我半途將其重寫爲使用var List,但從Scala的默認不可變列表中刪除項目有點痛苦 - 我懷疑它適合併發訪問。
所以,基本問題:我應該在併發訪問情況下使用什麼樣的集合類型,以及它是如何使用的?
(也許繼發性:是演員實際上是一個多線程的實體,或者是,只是我的錯誤觀念,它處理郵件一次一個在單個線程?)
(第三:在Scala中,有什麼收藏類型是最好的插入和隨機訪問(刪除/更新)?)
編輯:對善良響應者:請原諒我遲到的答覆,我做了一個討厭的習慣,拋出一個SO或郵件列表的問題,然後進入下一個問題,暫時忘記原來的問題。
演員一次處理一條消息。演員的併發性來自異步消息處理,而不是來自同時處理多條消息的參與者。 –
您試圖解決的業務問題是什麼? –
@ViktorKlang:我會試着解釋一下。用戶通過REST服務向服務器發送名爲NotificationPlan的模型對象。根據NotificationPlan,會生成一些通知對象,這些通知對象將在未來的某個時刻發回給用戶(以Apple推送通知的形式)。 在這種情況下,具有問題中所述列表的actor在內存中維護一個NotificationPlans列表,以便用戶在最初添加它之後可以更新或刪除他的計劃。 – fwielstra