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

标签 scala collections concurrency

我有一个 Actor,其本质是维护一个对象列表。它具有三个基本操作:添加、更新和删除(有时从添加方法调用删除,但除此之外),并且适用于单个集合。显然,该后备列表是同时访问的,添加和删除调用不断地相互交错。

我的第一个版本使用了 ListBuffer,但我在某处读到它不适用于并发访问。我没有遇到并发访问异常,但我确实注意到,从中查找和删除对象并不总是有效,可能是由于并发性所致。

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

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

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

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

编辑:致善良的回复者:请原谅我迟到的回复,我正在养成一个讨厌的习惯,即在 SO 或邮件列表上转储问题,然后继续处理下一个问题,暂时忘记原来的问题。

最佳答案

看看 scala.collection.mutable.Synchronized* 特征/类。

这个想法是将 Synchronized 特征混合到常规可变集合中以获得它们的同步版本。

例如:

import scala.collection.mutable._
val syncSet = new HashSet[Int] with SynchronizedSet[Int]
val syncArray = new ArrayBuffer[Int] with SynchronizedBuffer[Int]

关于scala - 如何处理对 Scala 集合的并发访问?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8255991/

相关文章:

ruby-on-rails - 如何同时获取多个提要

scala - 为什么在 Scala 中使用类型格?

javascript - 无法使用 React 显示 mongo 集合

scala - 如何将 Seq[Byte] 转换为 Array[Boolean] 表示 Scala 中的每一位

node.js - 如何在mongodb中查找一个对象

java - 在 Java 中打印 HashMap

java - 我应该将共享静态变量指定为 volatile 吗?

java - 在 ExecutorService 上调度的守护线程;解释为什么这是不好的形式

scala - scala 2.10 的 spark 1.6 中奇怪的隐式转换问题

android - 如何将 scala sbt 项目构建为 Android 库?