Twitter称,Scala无法释放原始的无懈可击的不稳定领域.真正?
优秀的Twitter util库具有以下
Java类,该类由Scala类扩展,该类读取volatile字段并使用AtomicReferenceFieldUpdater对其进行更新.访问必须至少是私有的,即必须允许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,它将很乐意放松对该字段的访问限制. 这也意味着更新程序(恰好位于伴随模块中)也可以访问它. (因为对象私有成员不会发出var的普通访问者,所以你可以使用parens定义自己的.但你不需要在调用站点使用parens,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 不仅“可以提出并回答你自己的问题”, http://blog.stackoverflow.com/2011/07/its-ok-to-ask-and-answer-your-own-questions/ 它更令人满意. (对Daniel Sobral,Rex Kerr,Retronym和其他正义联盟的更多权力.) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |