Scala valori pigri: penalizzazione delle prestazioni? Threadsafe? [duplicare]
-
28-09-2019 - |
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.
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