Domanda

  

Eventuali duplicati:
   Qual è la (nascosto) costo del Val pigro? (Scala)

Scala permette la definizione di valori pigri

lazy val maybeUnusedValue = someCostlyInitialization

dove someCostlyInitialization viene valutata solo sul primo uso di maybeUnusedValue. Cioè, viene valutato al massimo una volta, e se maybeUnusedValue non viene mai utilizzato, è anche mai valutato a tutti.

E 'questo threadsafe? Quali sono le implicazioni sulle prestazioni di questo? Se questo è essere threadsafe, deve utilizzare una sorta di sincronizzazione / usare Java volatili in qualche modo. Purtroppo la specifica del linguaggio Scala non dice nulla su questo.

È stato utile?

Soluzione

È fatto thread-safe utilizzando ricontrollato blocco http://code-o-matic.blogspot.com/2009/05/double-checked-locking-idiom-sweet-in.html Ovviamente questo significa che l'accesso a vals pigri è più lento di quelli non pigri.

Altri suggerimenti

UPDATE: OOPS, come Vasil sottolineato, la domanda è una copia di un altro filo, e come spesso accade, quindi è questa risposta.

Ho preso questa classe:

class Foo {
  lazy val test = "hi"
}

Compilato e decompilato (con 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;
    }
  }
}

Come si può vedere che sta usando il doppio paradigma di controllo con una variabile volatile. Quindi penso che sia sicuro

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top