gpt4 book ai didi

scala - Twitter 说 Scala 不能发出原始的未修饰的 volatile 字段。真的?

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

精细的 Twitter util 库具有以下 Java 类,该类由 Scala 类扩展,该类读取 volatile 字段并使用 AtomicReferenceFieldUpdater 对其进行更新。访问必须至少是私有(private)的,即必须允许 other.state。

评论中的动机主张是真的吗?太对了? (“如何”意味着以何种方式和程度。)

public class IVarField<A> {
/** This is needed because we cannot create a field like this in Scala. */
volatile State<A> state;
}

最佳答案

类似以下的工作。
将字段设为“private [this]”会将其转换为所需的字段引用(“getfield”)。
来自不同实例的访问是通过访问器“state()”进行的,如果将其设为@inline,将很高兴地放松对该字段的访问限制。
这也意味着更新程序(恰好位于配套模块中)也可以访问它。
(因为不会为对象私有(private)成员发出 var 的普通访问器,所以您可以使用括号定义自己的访问器。但您不需要在调用站点 other.state 使用括号。您的统一访问原则美元在工作中。或瑞士法郎。)
还要注意 `new` 的完全时髦用法在参数名称的反引号中。我什至不知道如何让刻度出现在这个标记中。因为两个参数是相同的类型,所以可能要写cas(expect=prev, `new`=changed)。 ,所以我可能使用了next相反,但如果这个标记支持时髦的竖起大拇指,我现在就给它。 :+1: 有用吗?谁能看到我的拇指? [我想我在 github 上看到了。 Hubster,而不是时髦。]

object IVar {
// TODO: retrieve mangled name by reflection
private final val stateField = "com$twitter$concurrent$IVar$$state"
private val stateUpd = AtomicReferenceFieldUpdater.newUpdater(
classOf[IVar[_]], classOf[State[_]], stateField)
}

final class IVar[A] { //}extends IVarField[A] {
import IVar._

@volatile private[this] var state: State[A] = initState: State[A]

@inline private final def state(): State[A] = this.state

override def toString = "Ivar@%s(state=%s)".format(hashCode, state)

@inline private[this]
def cas(expect: State[A], `new`: State[A]) = stateUpd.compareAndSet(this, expect, `new`)

def depth: Int = {
@tailrec
def loop(iv: IVar[_], d: Int): Int = iv.state match {
case Linked(iv) => loop(iv, d + 1)
case _ => d
}
loop(this, 0)
}
// etc
}
显示 state() 确实是内联的:
private final int loop$1(com.twitter.concurrent.IVar, int);
flags: ACC_PRIVATE, ACC_FINAL
Code:
stack=3, locals=5, args_size=3
0: aload_1
// Field com$twitter$concurrent$IVar$$state:Lcom/twitter/concurrent/ivar/State;
1: getfield #16
4: astore_3
不仅“可以提出和回答自己的问题”,
https://blog.stackoverflow.com/2011/07/its-ok-to-ask-and-answer-your-own-questions/
它更令人满意。
(Daniel Sobral、Rex Kerr、Retronym 和正义联盟的其他成员拥有更多权力。)

关于scala - Twitter 说 Scala 不能发出原始的未修饰的 volatile 字段。真的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12486992/

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