我正在使用 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/