8

優れたTwitterutilライブラリには次のJavaクラスがあります。これは、揮発性フィールドを読み取り、AtomicReferenceFieldUpdaterを使用して更新するScalaクラスによって拡張されます。アクセスは少なくともプライベートである必要があります。つまり、other.stateを許可する必要があります。

コメントの動機付けの主張は本当ですか?どのくらい本当ですか?(「どのように」とは、どのように、どの程度までを意味します。)

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

1 に答える 1

14

次のような作品です。

フィールドを「private[this]」にすると、目的のフィールド参照( "getfield")になります。

別のインスタンスからのアクセスは、アクセサ「state()」を介して行われます。これを@inlineにすると、フィールドへのアクセス制限が緩和されます。

これは、アップデーター(コンパニオンモジュールにたまたま存在する)もそれにアクセスできることを意味します。

(varの通常のアクセサーはobject-privateメンバーには発行されないため、parensを使用して独自のアクセサーを定義できます。ただし、呼び出しサイトother.stateでparensを使用する必要はありません。統一アクセスの原則はドルです。職場で。またはスイスフラン。)

`new`また、パラメータ名のバックティックでの完全にヒップな使用法にも注意してください。このマークアップにダニを表示する方法すらわかりません。両方のパラメーターが同じタイプであるため、1つは書きたいと思う可能性が高いcas(expect=prev, `new`=changed)ので、代わりに使用した可能性がありますnextが、このマークアップが流行に敏感な親指を立てるのをサポートしている場合は、今すぐ提供します。:+1:動作しましたか?誰かが私の親指を見ることができますか?[私はそれをgithubで見たと思います。ヒップスターではなく、ハブスター。]

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/

それは無限に満足です。

(ダニエル・ソブラル、レックス・カー、レトロニム、その他のジャスティス・リーグにさらに力を。)

于 2012-09-19T00:32:54.430 に答える