小编Jed*_*ith的帖子

Scala并行集合在某些方面比Java中已有的并行集合更好吗?

我最近一直在学习各种Java并发库,ConcurrentHashMap以及来自Cliff Click的可爱非阻塞库

我对Scala了解不多,但我听说过最近的并行集合库.

我想知道这个库对基于Java的库有哪些主要优点?

java collections parallel-processing concurrency scala

12
推荐指数
3
解决办法
1764
查看次数

如何在IsTraversableLike中使用类型成员A?

我正在尝试为Scala集合编写一些扩展方法,并且遇到麻烦,使它们完全一致.

对tailOption的第一次尝试会产生类似于:

implicit class TailOption[A, Repr <: GenTraversableLike[A, Repr]](val repr: Repr) {
  def tailOption: Option[Repr] = 
    if (repr.isEmpty) None 
    else Some(repr.tail)
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,这不起作用:

scala> List(1,2,3).tailOption
<console>:19: error: value tailOption is not a member of List[Int]
              List(1,2,3).tailOption
Run Code Online (Sandbox Code Playgroud)

Scala 2.10提供了IsTraversableLike类型类来帮助适应所有集合(包括像String这样的奇数集合).

有了这个,我可以很容易地实现tailOption:

implicit class TailOption[Repr](val r: Repr)(implicit fr: IsTraversableLike[Repr]) {
  def tailOption: Option[Repr] = { 
    val repr = fr.conversion(r)
    if (repr.isEmpty) None 
    else Some(repr.tail)
  }
}

scala> List(1,2,3).tailOption
res12: Option[List[Int]] = Some(List(2, 3))

scala> "one".tailOption
res13: Option[String] = Some(ne)
Run Code Online (Sandbox Code Playgroud)

结果是正确的类型:Option[<input-type>].具体来说,我可以Repr …

scala

9
推荐指数
1
解决办法
254
查看次数

如何从scala配套对象获取AtomicReferenceFieldUpdater?

如果我在某个集合结构中有一个链接节点,我真的不希望它的下一个链接是AtomicReference(我需要原子CAS更新)所以我将它声明为:

@volatile var next: Node[A] = _n
Run Code Online (Sandbox Code Playgroud)

然后在同伴声明:

val updater = AtomicReferenceFieldUpdater.newUpdater(classOf[Link[_]], classOf[Node[_]], "n")
def cas[A](target: Link[A], old: Node[A], newNode: Node[A]) = updater.compareAndSet(target, old, newNode);
Run Code Online (Sandbox Code Playgroud)

在运行时,我收到以下错误:

java.lang.RuntimeException: java.lang.IllegalAccessException: 
  Class concurrent.Link$ can not access a member of class concurrent.Link
  with modifiers "private volatile"
    at java.util.concurrent.atomic.AtomicReferenceFieldUpdater$AtomicReferenceFieldUpdaterImpl.<init>(AtomicReferenceFieldUpdater.java:189)
    at java.util.concurrent.atomic.AtomicReferenceFieldUpdater.newUpdater(AtomicReferenceFieldUpdater.java:65)
    at concurrent.Link$.<init>(Link.scala:106)
    ...
Run Code Online (Sandbox Code Playgroud)

因此,在运行时,伴随对象concurrent.Link$不是,concurrent.Link并且不同的类不能访问另一个的私有成员.

但是,如果我 javap -p concurrent.Link

我明白了:

Compiled from "Link.scala"
public final class concurrent.Link implements concurrent.Node,scala.ScalaObject,scala.Product,java.io.Serializable{
private final java.lang.Object value;
private volatile com.atlassian.util.scala.concurrent.Node node;
public static final boolean …
Run Code Online (Sandbox Code Playgroud)

concurrency scala java.util.concurrent

5
推荐指数
1
解决办法
754
查看次数