質問

可能な複製:
怠zyなヴァルの(隠された)コストはいくらですか? (スカラ)

Scalaは、怠zyな値の定義を許可します

lazy val maybeUnusedValue = someCostlyInitialization

どこ someCostlyInitialization の最初の使用でのみ評価されます maybeUnusedValue. 。つまり、せいぜい一度評価されます、そして maybeUnusedValue 使用されることはありません。また、まったく評価されません。

このスレッドセーフですか?これのパフォーマンスへの影響は何ですか?これがthreadsafeである場合、何らかのsyncronization / feats java揮発性を何らかの方法で使用する必要があります。残念ながら SCALA言語仕様 これについては何も言いません。

役に立ちましたか?

解決

ダブルチェックロックを使用してスレッドセーフになります http://code-o-matic.blogspot.com/2009/05/double-checked-locking-idiom-sweet-in.html 明らかに、これは、怠zyなバルズへのアクセスが怠zyなバルよりも遅いことを意味します。

他のヒント

更新:おっと、Vasilが指摘したように、質問は別のスレッドのコピーであり、それが起こるように、この答えもそうです。

私はこのクラスを受講しました:

class Foo {
  lazy val test = "hi"
}

コンパイルされて逆コンパイルされた(JD-GUIを使用):

public class Foo
  implements ScalaObject
{
  private String test;
  public volatile int bitmap$0;

  public String test()
  {
    if (
      (this.bitmap$0 & 0x1) == 0);
    synchronized (this)
    {
      if (
        (this.bitmap$0 & 0x1) == 0) {
        this.test = "hi"; this.bitmap$0 |= 1; } return this.test;
    }
  }
}

ご覧のとおり、揮発性変数でダブルチェックパラダイムを使用しています。だから私はそれが安全だと思う

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top