Frage

  

Mögliche Duplizieren:
   Was ist die (versteckten) Kosten für faule val? (Scala)

Scala erlaubt die Definition von faulen Werte

lazy val maybeUnusedValue = someCostlyInitialization

Dabei gilt someCostlyInitialization nur auf der ersten Verwendung von maybeUnusedValue ausgewertet wird. Das heißt, es höchstens einmal ausgewertet wird, und wenn maybeUnusedValue nie verwendet wird, wird es auch überhaupt nicht bewertet.

Ist das THREAD? Was sind die Auswirkungen auf die Leistung dieser? Wenn dies THREAD sein, hat es eine Art von syncronization verwenden / verwenden Java volatil in gewisser Weise. Leider ist die Scala Sprachspezifikation nichts dazu sagt.

War es hilfreich?

Lösung

Es ist Thread-sicher mit doppelseitiger checked Verriegelung http://code-o-matic.blogspot.com/2009/05/double-checked-locking-idiom-sweet-in.html Offensichtlich bedeutet dies, dass Zugriff auf faule vals ist langsamer als nicht-faulen.

Andere Tipps

UPDATE: OOPS, als Vasil wies darauf hin, die Frage ist eine Kopie von einem anderen Thread, und wie es geschieht, ist so diese Antwort.

Ich habe diese Klasse:

class Foo {
  lazy val test = "hi"
}

Zusammengestellt und dekompilierten (mit 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;
    }
  }
}

Wie Sie sehen es die doppelte Kontrolle Paradigma mit einer flüchtigen Variable verwendet. Also ich denke, es ist sicher

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top