15

重複の可能性:
lazy val の (隠された) コストは? (スカラ)

Scala では遅延値の定義が可能

lazy val maybeUnusedValue = someCostlyInitialization

wheresomeCostlyInitializationは の最初の使用時にのみ評価されますmaybeUnusedValue。つまり、評価されるのは多くても 1 回であり、maybeUnusedValue一度も使用されていない場合は、まったく評価されません。

これはスレッドセーフですか?これのパフォーマンスへの影響は何ですか?これをスレッドセーフにする場合は、ある種の同期化を使用するか、何らかの方法で Java volatile を使用する必要があります。残念ながら、Scala 言語仕様はこれについて何も述べていません。

4

2 に答える 2

13

二重チェックのロックhttp://code-o-matic.blogspot.com/2009/05/double-checked-locking-idiom-sweet-in.htmlを使用してスレッドセーフになります非遅延のものよりも遅いです。

于 2010-11-04T09:20:45.050 に答える
7

更新:おっと、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;
    }
  }
}

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

于 2010-11-04T09:20:05.927 に答える