scala - Scala 的 collection.mutable.PriorityQueue 线程安全吗?

标签 scala data-structures concurrency

我正在使用 PriorityQueue跨多个线程。我不确定它是线程安全的数据结构。

使用是否安全scala.collection.mutable.PriorityQueue跨多个线程?

最佳答案

TL;DR:这不安全。

我们来看一下! scala.collection.mutable.PriorityQueue uses

private val resarr = new ResizableArrayAccess[A]

其中 ResizableArrayAccess 是 defined在 PriorityQueue 中作为
private class ResizableArrayAccess[A] extends AbstractSeq[A] with ResizableArray[A] with Serializable {

从那里,前往 scala.collection.mutable.ResizableArray ,很明显这不是线程安全的,例如通过查看 update方法:
protected var array: Array[AnyRef] = new Array[AnyRef](math.max(initialSize, 1))
 // ... snip ... //
def update(idx: Int, elem: A) {
  if (idx >= size0) throw new IndexOutOfBoundsException(idx.toString)
  array(idx) = elem.asInstanceOf[AnyRef]
}

因此,我们可以不 protected 地访问可变变量并使用 scala.collection.mutable.PriorityQueue不鼓励来自多个线程。

如果您确实需要从多个线程使用它并且并发性并不重要,则可以使用同步的某种含义,例如scala.util.SyncVar以防止并发问题,如竞争条件。否则使用其他数据结构会更好。

关于scala - Scala 的 collection.mutable.PriorityQueue 线程安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31847852/

相关文章:

scala - 如何在 Scala 中使用字符串插值将字符串格式化为固定宽度字符串?

scala - 为什么方差注释会导致 Scala 无法推断出这种子类型关系?

scala - 隐式类也可以是动态的吗?

c# - C#中用于字符串搜索的最有效的集合类是什么

python - 什么数据结构容器可以按日期排序

java - 如何返回已在 4 个不同线程中编辑过的变量的一个实例?

concurrency - 测试 go channel 吞吐量 - 所有 goroutines 死锁

scala - 如何计算 Spark Dataframe 中的列数?

scala - Scala 中的协变树

java - 以安全的方式设置 servlet 上下文属性