Scala valores perezosos: penalización de rendimiento? ¿A salvo de amenazas? [duplicar]
-
28-09-2019 - |
Pregunta
Duplicar posibles:
¿Cuál es la (oculto) el costo de Val perezoso? (Scala)
Scala permite la definición de los valores de descanso
lazy val maybeUnusedValue = someCostlyInitialization
donde se evalúa someCostlyInitialization
sólo en el primer uso de maybeUnusedValue
. Es decir, se evalúa como máximo una vez, y si maybeUnusedValue
nunca se utiliza, que es también no se evaluaron en absoluto.
¿Es esta multi-hilo? ¿Cuáles son las implicaciones de rendimiento de esta? Si esto es ser multi-hilo, tiene que usar algún tipo de sincronización / utilizar Java volátil de alguna manera. Por desgracia, la href="http://www.scala-lang.org/node/198" rel="nofollow noreferrer"> especificación del lenguaje no dice nada acerca de esto.
Solución
Se hace thread-safe usando doble comprobado de bloqueo http://code-o-matic.blogspot.com/2009/05/double-checked-locking-idiom-sweet-in.html Obviamente esto significa que el acceso a Vals perezosos es más lento que los no perezosos.
Otros consejos
ACTUALIZACIÓN: OOPS, como Vasil señaló, la cuestión es una copia de otro hilo, y como sucede, por lo que es esta respuesta.
Tomé esta clase:
class Foo {
lazy val test = "hi"
}
Compilado y descompilado (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;
}
}
}
Como se puede ver que está utilizando el paradigma de retención doble con una variable volátil. Así que creo que es seguro