【发布时间】:2012-01-05 13:26:02
【问题描述】:
我有一个 Actor,它本质上是维护一个对象列表。它具有三个基本操作,添加、更新和删除(有时删除是从 add 方法调用的,但除此之外),并且适用于单个集合。显然,该后备列表是同时访问的,添加和删除调用不断相互交错。
我的第一个版本使用了 ListBuffer,但我在某处读到它不适合并发访问。我没有遇到并发访问异常,但我确实注意到从中查找和删除对象并不总是有效,可能是由于并发性。
我正在重写它以使用 var List,但从 Scala 的默认不可变 List 中删除项目有点痛苦 - 我怀疑它是否适合并发访问。
那么,基本问题:在并发访问的情况下我应该使用什么集合类型,它是如何使用的?
(也许次要:Actor 实际上是一个多线程实体,还是这只是我的错误概念,它是否在单个线程中一次处理一个消息?)
(Tertiary:在 Scala 中,哪种集合类型最适合插入和随机访问(删除/更新)?)
编辑:致好心的回复者:对不起,我的回复太晚了,我养成了在 SO 或邮件列表上转储问题的坏习惯,然后继续处理下一个问题,暂时忘记了原来的问题。
【问题讨论】:
-
演员一次处理一条消息。与actor的并发来自异步消息处理,而不是来自一个actor同时处理多条消息。
-
您要解决的业务问题是什么?
-
@ViktorKlang:我会试着解释一下。用户通过 REST 服务向服务器发送一个称为 NotificationPlan 的模型对象。根据 NotificationPlan,会生成许多 Notification 对象,这些对象将在未来某一时刻被发送回用户(以 Apple 推送通知的形式)。在这种情况下,具有问题中描述的列表的参与者在内存中维护了一个 NotificationPlans 列表,以便用户在最初添加它之后可以更新或删除他的计划。
标签: scala collections concurrency