微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在Scala中使用ConcurrentLinkedQueue?

val nodes = Array.fill[mutable.Buffer[Int]](numNodes){new ArrayBuffer[Int]() with mutable.SynchronizedBuffer[Int]}

def addMutualEdge(i: Int)(j: Int) {nodes(i) += j; nodes(j) += i}

当我编译它时,我得到弃用警告:

SynchronizedBuffer is deprecated. Synchronization via traits is deprecated as it is inherently reliable. Consider java.util.concurrent.ConcurrentLinkedQueue as an alternative

如何在上面的代码中使用java库?

解决方法

您可以使用ConcurrentLinkedQueue而不是Buffer,因为它也是可变的:

scala> import java.util.concurrent._
import java.util.concurrent._

scala> val nodes = Array.fill(10){new ConcurrentLinkedQueue[Int]()}
nodes: Array[java.util.concurrent.ConcurrentLinkedQueue[Int]] = Array([],[],[])

scala> def addMutualEdge(i: Int)(j: Int) {nodes(i).add(j); nodes(j).add(i)}
addMutualEdge: (i: Int)(j: Int)Unit

它是最快的选项,因为此队列基于CAS操作,因此没有阻塞(与SynchronizedBuffer相比).另一种选择是直接同步操作:

scala> val nodes = Array.fill[mutable.Buffer[Int]](10){new ArrayBuffer[Int]()}
nodes: Array[scala.collection.mutable.Buffer[Int]] = Array(ArrayBuffer(),ArrayBuffer(),ArrayBuffer())

scala> def addMutualEdge(i: Int)(j: Int) = this.synchronized{nodes(i) += j; nodes(j) += i}
addMutualEdge: (i: Int)(j: Int)scala.collection.mutable.Buffer[Int]

您还可以将java的Collections.synchronizedList(…)与scala.collection.JavaConverters.asScala结合使用

import java.util._
import scala.collection.JavaConverters._
scala> val nodes = Array.fill(10){Collections.synchronizedList(new ArrayBuffer[Int]().asJava).asScala}
nodes: Array[scala.collection.mutable.Buffer[Int]] = Array(Buffer(),Buffer(),Buffer())

或者您可以使用atomicreferenceArray:

implicit class RichAtomic[T](a: atomicreferenceArray[List[T]]) { def apply(i: Int) = (a,i); def update(i: Int,e: List[T]) = a.set(i,e)}
implicit class RichList[T](a: (atomicreferenceArray[List[T]],Int)) { def ::=(e: T) = while({val lst = a._1.get(a._2);!a._1.compareAndSet(a._2,lst,e :: lst)}){}}
implicit def toList[T](a: (atomicreferenceArray[List[T]],Int)) = a._1.get(a._2)

val nodes = new atomicreferenceArray(Array.fill[List[Int]](10){Nil})

scala> def addMutualEdge(i: Int)(j: Int) = {nodes(i) ::= j; nodes(j) ::= i}
addMutualEdge: (i: Int)(j: Int)Unit

Implicits用于提供simillar接口,就像Array一样.注意,:: =将元素添加到列表的开头.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐