gpt4 book ai didi

scala - 如何从 scala 伴随对象中获取 AtomicReferenceFieldUpdater?

转载 作者:行者123 更新时间:2023-12-04 20:21:54 25 4
gpt4 key购买 nike

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

@volatile var next: Node[A] = _n

然后在同伴中声明:
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);

在运行时我收到以下错误:
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)
...

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

但是,如果我 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 cas(com.atlassian.util.scala.concurrent.Link, com.atlassian.util.scala.concurrent.Node, com.atlassian.util.scala.concurrent.Node);
public static final java.util.concurrent.atomic.AtomicReferenceFieldUpdater updater();

所以,除了 AtomicReferenceFieldUpdater 的静态实例,我什么都有。在我的 Link 上声明类(class)。

问题是,我如何获得 AtomicReferenceFieldUpdater 的实例在 Scala 中指向 volatile var?

到目前为止,我发现的唯一方法是回到 Java(使用下一个 Node 字段和静态 AtomicReferenceFieldUpdater 实现 AbstractLink )并从中继承,这很难看。

最佳答案

难的。由于 Scala 将字段设为私有(private),并且只有访问器方法可用,因此这可能是不可能的。

这样做时,我最终决定通过使用 volatile 字段创建 Java 基类并通过那里进行更新来做到这一点。

Java 文件:

public class Base {
volatile Object field = null;
}

斯卡拉文件:
class Cls extends Base {
val updater = AtomicReferenceFieldUpdater.newUpdater(classOf[Base[_]], classOf[Object[_]], "field")
def cas[A](old: Object, n: Object) = updater.compareAndSet(this, old, n);
}

我还没有想出不同的方法。

关于scala - 如何从 scala 伴随对象中获取 AtomicReferenceFieldUpdater?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5574502/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com