如何处理对Scala集合的并发访问?

fwi*_*tra 11 collections concurrency scala

我有一个演员 - 从本质上讲 - 维护一个对象列表.它有三个基本操作,一个是添加,更新和删除(有时删除是从add方法调用的,但除此之外),并且可以使用单个集合.显然,后备列表是同时访问的,添加和删除调用不断交错.

我的第一个版本使用了ListBuffer,但我在某个地方阅读它并不意味着并发访问.我没有获得并发访问异常,但我确实注意到从中查找和删除对象并不总是有效,可能是由于并发.

我正在重写它以使用var List,但是从Scala的默认不可变List中删除项目有点痛苦 - 我怀疑它适合并发访问.

所以,基本问题:我应该在并发访问情况下使用哪种集合类型,以及如何使用它?

(也许是次要的:一个Actor实际上是一个多线程实体,还是只是我的错误概念,它是否在一个线程中一次处理一个消息?)

(第三级:在Scala中,哪种集合类型最适合插入和随机访问(删除/更新)?)

编辑:对那些响应者:原谅我迟到的回复,我正在制作一个讨厌的习惯,因为在SO或邮件列表上倾倒问题,然后转到下一个问题,暂时忘记原始问题.

hba*_*sta 11

看一下scala.collection.mutable.Synchronized*traits/classes.

我们的想法是将Synchronized traits混合到常规可变集合中以获得它们的同步版本.

例如:

import scala.collection.mutable._
val syncSet = new HashSet[Int] with SynchronizedSet[Int]
val syncArray = new ArrayBuffer[Int] with SynchronizedBuffer[Int]
Run Code Online (Sandbox Code Playgroud)

  • 请不要这样做,它不会扩展. (16认同)
  • 从Scala 2.11开始,不推荐使用SyncronizedSet:不推荐使用traits同步,因为它本身就不可靠.考虑java.util.concurrent.ConcurrentHashMap [A​​,Unit]作为替代. (16认同)