1

アトミック変数を設定する次のコードがあります(両方とも同じようjava.util.concurrent.atomicmonix.execution.atomic動作します:

class Foo {
  val s = AtomicAny(null: String)

  def foo() = {
    println("called")
    /* Side Effects */ 
    "foo" 
  }

  def get(): String = {
    s.compareAndSet(null, foo())
    s.get
  }
}


val f = new Foo
f.get //Foo.s set from null to foo, print called
f.get //Foo.s not updated, but still print called

2 回目の比較では、値は更新されませんでしたが、それでも foo が呼び出されます。副作用があるため、これは問題を引き起こしてfooいます (私の実際のコードでは、Akka アクターを作成し、重複したアクターを作成しようとするため、エラーが発生します)。

実際に使用されない限り、2 番目のパラメーターが評価されないようにするにはどうすればよいですか? (できれば同期を使用しないでください)

lazy val が機能しないように、暗黙のパラメーターを foo に渡す必要があります。例えば

  lazy val s = get() //Error cannot provide implicit parameter

  def foo()(implicit context: Context) = {
    println("called")
    /* Side Effects */ 
    "foo" 
  }

  def get()(implicit context: Context): String = {
    s.compareAndSet(null, foo())
    s.get
  }
4

1 に答える 1